작동하는 MVVM에 대한 오래된 책의 코드가 있지만 Rhino Mocks를 사용한 테스트는 다음 메시지와 함께 실패합니다.
테스트 메서드 TestProject.UnitTest1.UpdateCustomer_Always_CallsUpdateWithCustomer에서 예외가 발생했습니다. Rhino.Mocks.Exceptions.ExpectationViolationException : DataProvider.DoSomething (ConsoleApp.Customer); 예상 # 1, 실제 # 0
나는 동등하다고 생각하는 예를 제공하고 있습니다.
namespace ConsoleApp {
class Program { static void Main () { } }
public class Customer { public string ID { get; set; } }
public class DataProvider {
public virtual Customer GetCustomer (string id) => new Customer ();
public virtual void DoSomething (Customer customer) { }
}
public class ViewModel {
DataProvider _dataProvider;
Customer _customer;
public ViewModel (DataProvider dataProvider, string id) {
_dataProvider = dataProvider;
_customer = new Customer { ID = id };
}
public void DoSomething () => _dataProvider.DoSomething (_customer);
}
}
그리고 실패한 테스트
namespace TestProject {
[TestClass]
public class UnitTest1 {
[TestMethod]
public void UpdateCustomer_Always_CallsUpdateWithCustomer () {
DataProvider dataProviderMock = MockRepository.GenerateMock<DataProvider> ();
Customer expectedCustomer = new Customer ();
dataProviderMock.Stub (u => u.GetCustomer (Arg<string>.Is.Anything)).Return (expectedCustomer);
ViewModel target = new ViewModel (dataProviderMock, string.Empty);
target.DoSomething ();
dataProviderMock.AssertWasCalled (d => d.DoSomething (expectedCustomer));
}
}
}
이 결과에 대한 여러 게시물 (예 : 1 및 2)을 읽었 지만 도움이되지 않습니다. 흥미로운 답변 을 읽었습니다 .
일반적으로 테스트에서 빌드 한 개체 인수를 사용하여 스텁 메서드를 호출하고 테스트 된 코드에서 해당 메서드를 호출하기 전에 개체가 빌드되면이 오류가 발생합니다.
이것이 Rhino Mocks가 실패하는 이유 일 수 있지만 버그 인 것 같습니다.
내 질문은 : 내 테스트에 문제가 있고 Rhino Mocks에 버그가 있거나 내 코드에 문제가 있습니까?
테스트 스텁 DataProvider.GetCustomer
은 어설 션에 사용될 예상 고객 인스턴스를 반환하지만 예제 뷰 모델은 DataProvider.GetCustomer
.
생성자에서 초기화 된 것을 사용하고 있습니다.
//...
public ViewModel (DataProvider dataProvider, string id) {
_dataProvider = dataProvider;
_customer = new Customer { ID = id };
}
//...
따라서 테스트에서 발생한 예외는 표시된 예제에서 정확합니다.
이는 뷰 모델이 사용하는 실제 인스턴스가 테스트를 실행할 때 어설 션에 사용되는 인스턴스가 아니기 때문입니다.
//...
dataProviderMock.AssertWasCalled (d => d.DoSomething (expectedCustomer));
테스트가 배열에 따라 예상대로 작동하려면 뷰 모델이 실제로 리팩토링되어 초기화에서 분리되어야합니다. Customer
예를 들면
public class ViewModel {
DataProvider _dataProvider;
string id;
public ViewModel (DataProvider dataProvider, string id) {
_dataProvider = dataProvider;
this.id = id;
}
public void DoSomething () {
Customer customer = _dataProvider.GetCustomer(id);
_dataProvider.DoSomething (_customer);
}
}
테스트는 또한 테스트하려는 대상에 대해 더 명확해야합니다.
[TestClass]
public class UnitTest1 {
[TestMethod]
public void UpdateCustomer_Always_CallsUpdateWithCustomer () {
//Arrange
DataProvider dataProviderMock = MockRepository.GenerateMock<DataProvider> ();
string id = "FakeId";
Customer expectedCustomer = new Customer { ID = id };
dataProviderMock.Stub (u => u.GetCustomer (id))
.Return (expectedCustomer);
ViewModel target = new ViewModel (dataProviderMock, id);
//Act
target.DoSomething ();
//Assert
dataProviderMock.AssertWasCalled (d => d.DoSomething (expectedCustomer));
}
}
또는 뷰 모델이 의도 한대로라면 테스트는 기대치를 다르게 주장해야합니다.
[TestClass]
public class UnitTest1 {
[TestMethod]
public void UpdateCustomer_Always_CallsUpdateWithCustomer () {
//Arrange
DataProvider dataProviderMock = MockRepository.GenerateMock<DataProvider> ();
string id = "FakeId";
ViewModel target = new ViewModel (dataProviderMock, id);
//Act
target.DoSomething ();
//Assert
dataProviderMock
.AssertWasCalled (d => d.DoSomething (Arg<Customer>.Matches(c => c.ID == id));
}
}
호출 될 때 전달 된 특정 인스턴스 대신 예상 인수의 특성을 확인하기 위해 어설 션에 사용 된 대리자를 참고하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다