2015-04-26 5 views
0

Я пытаюсь научиться 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>(); 

} 

Я не knwo как проверить, что это правда, и самое главное, я не могу запустить тест,

потому что я получаю эту ошибку Ожидаемый: EntityTest.TDD.NotEnoughMoneyException Но был: System.NotSupportedException: Invalid установки на невиртуальный (переопределение в VB) члена: х => x.Creat eWithMoney (It.IsAny())

ответ

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 для получения дополнительной информации.

+0

Так что, в заключение, мне не нужно добавлять проверку assert в конце теста, если я использую ожидаемое исключение как atrribute – user1765862

+0

Правильно, MSTest обрабатывает исключение здесь. Вы указываете только исключение, за исключением случаев, когда тест выполняется. – Oliver

+1

Все зависит от того, какую структуру тестирования вы используете. Однако многие из них имеют такой атрибут, например ['Microsoft.VisualStudio.TestTools.UnitTesting.ExpectedExceptionAttribute'] (https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting. expectedexceptionattribute.aspx) и ['NUnit.Framework.ExpectedExceptionAttribute'] (http://www.nunit.org/index.php?p=exception&r=2.4.8) и [' csUnit.ExpectedExceptionAttribute'] (http: //www.csunit.org/documentation/classdoc.1.8/csUnit.ExpectedExceptionAttribute.html) и т. д. –