Próbuję przeprowadzić test jednostkowy/sprawdzić, czy metoda jest wywoływana w zależności od testowanego systemu (SUT).Testowanie jednostkowe za pomocą Mocks, gdy SUT korzysta z zadania Równoległego Libaray
- Depedency to IFoo.
- Klasa zależna to IBar.
- IBar jest zaimplementowany jako pasek.
- Pasek wywoła Start() w IFoo w nowym zadaniu (System.Threading.Tasks.), Gdy funkcja Start() zostanie wywołana w instancji Bar.
Test jednostki (Moq):
[Test]
public void StartBar_ShouldCallStartOnAllFoo_WhenFoosExist()
{
//ARRANGE
//Create a foo, and setup expectation
var mockFoo0 = new Mock<IFoo>();
mockFoo0.Setup(foo => foo.Start());
var mockFoo1 = new Mock<IFoo>();
mockFoo1.Setup(foo => foo.Start());
//Add mockobjects to a collection
var foos = new List<IFoo>
{
mockFoo0.Object,
mockFoo1.Object
};
IBar sutBar = new Bar(foos);
//ACT
sutBar.Start(); //Should call mockFoo.Start()
//ASSERT
mockFoo0.VerifyAll();
mockFoo1.VerifyAll();
}
Realizacja IBAR jak Bar:
class Bar : IBar
{
private IEnumerable<IFoo> Foos { get; set; }
public Bar(IEnumerable<IFoo> foos)
{
Foos = foos;
}
public void Start()
{
foreach(var foo in Foos)
{
Task.Factory.StartNew(
() =>
{
foo.Start();
});
}
}
}
Moq Wyjątek:
*Moq.MockVerificationException : The following setups were not matched:
IFoo foo => foo.Start() (StartBar_ShouldCallStartOnAllFoo_WhenFoosExist() in
FooBarTests.cs: line 19)*
Czy istnieje jakiś szczególny powód, dla którego nie należy napisać prostej, próbnej implementacji 'IFoo', a zamiast tego użyć? –