Je suis un appareil de test d'une interface ICustomerRepository
utilisé pour récupérer des objets de type Customer
.Quel est le but de l'unité de test d'un référentiel d'interface
- En tant que test unitaire, quelle valeur gagne-t-on en testant le
ICustomerRepository
de cette manière? - Dans quelles conditions le test ci-dessous échouerait-il?
- Pour les tests de cette nature est-il conseillé de faire des tests que je sais devrait échouer? à savoir chercher id
4
quand je sais que je ne l'ai placé5
dans le dépôt
Je suis probablement manque quelque chose d'évident, mais il semble que les tests d'intégration de la classe qui implémente ICustomerRepository
sera de plus de valeur.
[TestClass]
public class CustomerTests : TestClassBase
{
private Customer SetUpCustomerForRepository()
{
return new Customer()
{
CustId = 5,
DifId = "55",
CustLookupName = "The Dude",
LoginList = new[]
{
new Login { LoginCustId = 5, LoginName = "tdude" },
new Login { LoginCustId = 5, LoginName = "tdude2" }
}
};
}
[TestMethod]
public void CanGetCustomerById()
{
// arrange
var customer = SetUpCustomerForRepository();
var repository = Stub<ICustomerRepository>();
// act
repository.Stub(rep => rep.GetById(5)).Return(customer);
// assert
Assert.AreEqual(customer, repository.GetById(5));
}
}
Base de test de classe
public class TestClassBase
{
protected T Stub<T>() where T : class
{
return MockRepository.GenerateStub<T>();
}
}
ICustomerRepository et IRepository
public interface ICustomerRepository : IRepository<Customer>
{
IList<Customer> FindCustomers(string q);
Customer GetCustomerByDifID(string difId);
Customer GetCustomerByLogin(string loginName);
}
public interface IRepository<T>
{
void Save(T entity);
void Save(List<T> entity);
bool Save(T entity, out string message);
void Delete(T entity);
T GetById(int id);
ICollection<T> FindAll();
}
Comment? Partout où je lis, on nous apprend à simuler une interface pour notre test unitaire. Comment testons-nous une implémentation concrète? Je pensais que cela devrait être évité à ma compréhension. Pouvez-vous donner un exemple? Je vous remercie! – Stack0verflow
Une interface est une spécification, une déclaration, pas un code que vous pouvez exécuter (et donc tester). Vous implémentez cette spécification dans des classes concrètes, c'est le code que vous allez exécuter et tester. Vous pouvez utiliser un simulacre pour implémenter une interface, pour vous aider à tester un autre code qui dépend des objets qui implémentent cette interface. Vous ne "testez pas une interface", vous testez que les implémentations de cette interface sont correctes, en appelant des méthodes d'interface sur ces implémentations ("test contre l'interface"). –
Exemple stupide: Une interface 'Eater' pour les choses qui' eat', implémentée par 'Dog' et appelée par' Master' dans une méthode 'feed (Eater pet)'. Lorsque vous testez 'Dog', vous testerez son implémentation de l'interface' Eater' en appelant 'eat' sur une instance de chien et voyez par ex. que le chien gagne du poids. Lorsque vous testez la méthode 'Master's' feed() ', vous créez un simulacre' Eater', passez-le à cette méthode et vérifiez que 'eat' a été appelé. –