Vous feriez mieux de trouver un autre exemple de test unitaire avec Rhino.Mocks. L'exemple ici se moque de la classe réelle sous test, ce que vous ne feriez jamais.
Supposons que vous ayez un PersonRepository et un PersonService. Vous voulez tester unitaire le PersonService qui utilise le PersonRepository. Mise en œuvre de la personne omise.
public interface IPersonService
{
Person GetPerson(int id);
List<Person> GetPersons();
}
public class PersonRepository
{
public virtual GetPerson(int id)
{
... implementation
}
public virtual GetPersons()
{
... implementation
}
}
public class PersonService : IPersonService
{
private PersonRepository Repository { get; set; }
public PersonService() : this(null) { }
public PersonService(PersonRepository repository)
{
this.Repository = repository ?? new PersonRepository();
}
public Person GetPerson(int id)
{
return this.Repository.GetPerson(id);
}
public List<Person> GetPersons()
{
return this.Repository.GetPersons();
}
}
Maintenant nous avons des tests unitaires pour nous assurer que le service appelle correctement le référentiel.
public void GetPersonTest()
{
var repository = MockRepository.GenerateMock<PersonRepository>();
var expectedPerson = new Person(1, "Name");
repository.Expect(r => r.GetPerson(1)).Return(expectedPerson);
var service = new PersonService(repository);
var actualPerson = service.GetPerson(1);
Assert.AreEqual(expectedPerson.ID, actualPerson.ID);
Assert.AreEqual(expectedPerson.Name, actualPerson.Name);
repository.VerifyAllExpectations();
}
public void GetPersonsTest()
{
var repository = MockRepository.GenerateMock<PersonRepository>();
var expectedPerson = new Person(1, "Name");
var listOfPeople = new List<Person> { expectedPerson };
repository.Expect(r => r.GetPersons()).Return(listOfPeople);
var service = new PersonService(repository);
var actualList = service.GetPersons();
Assert.AreEqual(1, actualList.Count);
var actualPerson = actualList.First();
Assert.AreEqual(expectedPerson.ID, actualPerson.ID);
Assert.AreEqual(expectedPerson.Name, actualPerson.Name);
repository.VerifyAllExpectations();
}
Vous n'avez pas besoin de mettre vos faux référentiels en mode relecture après avoir défini les attentes? –
Ceci utilise la nouvelle syntaxe AAA (Arrange Act Assert) - il n'est pas nécessaire de les mettre explicitement en mode replay. – tvanfosson
Nice. Je n'ai jamais vu cette syntaxe auparavant, et je n'ai pas remarqué que vous appeliez 'Expect()' directement sur l'objet fantaisie. Le wiki n'a pas encore beaucoup à dire sur la nouvelle syntaxe; La prochaine fois que j'écrirai des tests, je devrai essayer de contribuer. –