moq并获取异常

时间:2015-04-26 22:53:10

标签: unit-testing tdd moq

我试图用一些简单的例子来学习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())

1 个答案:

答案 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