我试图用一些简单的例子来学习moq测试 我有
public class CustomerService
{
private readonly ICustomerRepository _repository;
public CustomerService(ICustomerRepository repository)
{
_repository = repository;
}
public void CreateWithMoney(CustomerDTO dto)
{
var cust = new Customer { FirstName = dto.FirstName, LastName = dto.LastName, FinacialStatus = dto.FinacialStatus };
if (cust.FinacialStatus < 500)
{
throw new NotEnoughMoneyException();
}
_repository.Save(cust);
}
}
[Test]
public void ThrowExceptionIfMoneyIsLessThan500()
{
var mockRepo = new Mock<ICustomerRepository>();
var mockService = new Mock<CustomerService>(mockRepo.Object);
mockService.Setup(x => x.CreateWithMoney(It.IsAny<CustomerDTO>()))
.Throws<NotImplementedException>();
}
我不知道如何验证这是真的,最重要的是我无法进行测试,
因为我收到此错误预期: EntityTest.TDD.NotEnoughMoneyException但是: System.NotSupportedException:非虚拟设置无效 (在VB中可覆盖)成员:x =&gt; x.CreateWithMoney(It.IsAny())
答案 0 :(得分:1)
您无法模拟CreateWithMoney
方法,因为它不是虚拟的。添加virtual
关键字:
public virtual void CreateWithMoney(CustomerDTO dto)
{
...
}
如果您想测试当资金少于500时抛出异常,那么您的单元测试有一个更好的解决方案:
[Test]
[ExpectedException(typeof(NotEnoughMoneyException))]
public void ThrowExceptionIfMoneyIsLessThan500()
{
var repository = new Mock<ICustomerRepository>().Object;
var dto = ...; // Instantiate CustomerDTO that returns a value > 500 for FinancialStatus property
var target = new CustomerService(repository);
target.CreateWithMoney(dto);
}
正如您所看到的,ExpectedException
属性指定了您期望的异常类型。有关详细信息,请查看here。