Рассмотрим следующие сервисные интерфейсы:
public interface IServiceA
{
void DoSomething(string s);
void DoSomething(string s, bool b);
}
public interface IServiceB
{
void DoSomething();
}
Реализация IServiceB зависит от IServiceA следующим образом:
public class ServiceB : IServiceB
{
private IServiceA _serviceA;
public ServiceB(IServiceA serviceA)
{
_serviceA = serviceA;
}
public void DoSomething()
{
_serviceA.DoSomething("Hello", true);
}
}
Т.е.. зависимость вводится в конструктор.
Теперь рассмотрим юнит-тест для метода DoSomething()
. Я хочу утверждать, что один из перегруженных DoSomething-методов в IServiceA вызывается, но, следуя общему принципу, что модульные тесты не должны знать слишком много о внутренней работе тестируемого метода, я хочу быть независимым от того, какой из две перегрузки называется. Рассмотрим следующий модульный тест:
[TestFixture]
public class ServiceBTests
{
[Test]
public void DoSomething_CallsServiceA()
{
var serviceAMock = MockRepository.GenerateMock<IServiceA>();
var service = new ServiceB(serviceAMock);
service.DoSomething();
// Problem: How to check if EITHER:
serviceAMock.AssertWasCalled(s => s.DoSomething(Arg<String>.Is.NotNull, Arg<bool>.Is.Anything));
// OR:
serviceAMock.AssertWasCalled(s => s.DoSomething(Arg<String>.Is.NotNull));
}
}
Как я могу утверждать, что или один или был вызван другой из двух методов?