Betrachten Sie die folgende Service-Schnittstellen:Wie kann ich mit RhinoMocks feststellen, dass eine von mehreren Methoden aufgerufen wurde?
public interface IServiceA
{
void DoSomething(string s);
void DoSomething(string s, bool b);
}
public interface IServiceB
{
void DoSomething();
}
Die Implementierung von IServiceB hängt von IServiceA wie folgt aus:
public class ServiceB : IServiceB
{
private IServiceA _serviceA;
public ServiceB(IServiceA serviceA)
{
_serviceA = serviceA;
}
public void DoSomething()
{
_serviceA.DoSomething("Hello", true);
}
}
Ie. Die Abhängigkeit wird in den Konstruktor eingefügt.
Betrachten Sie nun einen Komponententest für die Methode DoSomething()
. Ich möchte behaupten, dass eine der überladenen DoSomething-Methoden in IServiceA aufgerufen wird, aber nach einem allgemeinen Prinzip, dass Komponententests nicht zu viel über die internen Abläufe der zu testenden Methode wissen sollten, möchte ich agnostisch sein, welche der zwei Überladungen wird aufgerufen. Betrachten Sie die folgende Einheit Test:
[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));
}
}
Wie kann ich behaupten, dass entweder ein oder die andere der beiden Methoden aufgerufen wurde?
Hmm. Vielleicht ist mein Denken hier verzerrt. Ich denke, der Unit-Test sollte sicherstellen, dass DoSomething() genau das tut, was es sollte. Und während die internen Abläufe der Methode nicht den Komponententest betreffen, führt es vielleicht dazu, genau zu wissen, was die Methode tun sollte, genau zu wissen, welche Überladung aufgerufen werden sollte. Irgendwelche Meinungen dazu? –