Ik was onlangs aan het testen met NUnit en Rhino Mock. Iets waar ik tegen aan liep met mijn unittesten, in een C# project, was dat mijn test class falende (rode) testen had. Als ik de unittesten apart uitvoerde werden ze per stuk groen. Mijn test class heeft de volgende elementen:
[TestFixture]
public class TestClass
{
private Class _target;
private MockRepository _mockRepository;
private OtherClass _otherClassMock;
public MockRepository MockRepository => _mockRepository ?? (_mockRepository = new MockRepository());
[SetUp]
public void SetUp()
{
_otherClassMock = MockRepository.StrictMock<OtherClass>();
_target = new Class(_otherClassMock);
}
[Test]
public void Test()
{
_otherClassMock.Expect(ocm => ocm.DoetIets().Repeat.Once().Return("Akkoord"));
MockRepository.ReplayAll();
var result = _target.DoeIets();
MockRepository.VerifyAll();
}
[Test]
public void TestTwee()
{
_otherClassMock.Expect(ocm => ocm.DoetIets().Repeat.Once().Return("Niet Akkoord"));
_otherClassMock.Expect(ocm => ocm.DoetIetsAnders().Repeat.Once().Return(false));
MockRepository.ReplayAll();
var result = _target.DoeIetsAnders();
MockRepository.VerifyAll();
}
}
Oplossing 1:
[TearDown]
public void TearDown()
{
MockRepository.BackToRecordAll();
}
Oplossing 2:
[TestFixture]
public class TestClass
{
private Class _target;
private MockRepository _mockRepository;
private OtherClass _otherClassMock;
[SetUp]
public void SetUp()
{
_mockRepository = new MockRepository(); //elke test maakt een new MockRepository ipv dezelfde MockRepository te gebruiken
_otherClassMock = _mockRepository.StrictMock<OtherClass>();
_target = new Class(_otherClassMock);
}
[Test]
public void Test()
{
_otherClassMock.Expect(ocm => ocm.DoetIets().Repeat.Once().Return("Akkoord"));
_mockRepository.ReplayAll();
var result = _target.DoeIets();
}
[Test]
public void TestTwee()
{
_otherClassMock.Expect(ocm => ocm.DoetIets().Repeat.Once().Return("Niet Akkoord"));
_otherClassMock.Expect(ocm => ocm.DoetIetsAnders().Repeat.Once().Return(false));
_mockRepository.ReplayAll();
var result = _target.DoeIetsAnders();
}
[TearDown]
public void TearDown()
{
MockRepository.VerifyAll();
}
}
Welke oplossing hebben we gekozen
Mijn eigen oplossing van Oplossing 1. Uit de review, door een collega van mij, kwam Oplossing 2. Uiteindelijk hebben we Oplossing 2 doorgevoerd aangezien dat het echte probleem oploste. Het ging namelijk verkeerd doordat dezelfde MockRepository instantie in elke test werd gebruikt. Aangezien de unittesten niet achter elkaar uitgevoerd worden, maar op meerdere threads tegelijk, gaat dit fout en heel terecht kreeg ik een foutmelding. Live and learn.