Sto provando a test dell'unità/verificare che un metodo venga chiamato su una dipendenza, dal sistema in prova (SUT).Test delle unità con Mocks quando SUT sta sfruttando Task Parallel Libaray
- La depenalizzazione è IFoo.
- La classe dipendente è IBar.
- IBar è implementato come barra.
- La barra chiamerà Start() su IFoo in una nuova attività (System.Threading.Tasks.), Quando Start() viene richiamato sull'istanza Barra.
Unit Test (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();
}
Attuazione IBar come 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 Eccezione:
*Moq.MockVerificationException : The following setups were not matched:
IFoo foo => foo.Start() (StartBar_ShouldCallStartOnAllFoo_WhenFoosExist() in
FooBarTests.cs: line 19)*
C'è qualche motivo particolare per non scrivere una semplice simulazione di "IFoo' stesso e usarlo invece? –