Je suis très novice dans le domaine des tests unitaires et de l'imitation. J'essaie d'écrire des tests unitaires qui couvrent un code qui interagit avec un magasin de données. L'accès aux données est encapsulé par IRepository :
interface IRepository<T> {
....
IEnumerable<T> FindBy(Expression<Func<T, bool>> predicate);
....
}
Le code que j'essaie de tester, en utilisant une implémentation concrète de IRepository sous IoC, ressemble à ceci :
public class SignupLogic {
private Repository<Company> repo = new Repository<Company>();
public void AddNewCompany(Company toAdd) {
Company existingCompany = this.repo.FindBy(c => c.Name == toAdd.Name).FirstOrDefault();
if(existingCompany != null) {
throw new ArgumentException("Company already exists");
}
repo.Add(Company);
repo.Save();
}
}
Afin de tester la logique de SignupLogic.AddNewCompany() elle-même, plutôt que la logique et le référentiel concret, je crée un modèle de IRepository et le passe à SignupLogic. Le Repository simulé ressemble à ceci :
Mock<Repository> repoMock = new Mock<Repository>();
repoMock.Setup(moq => moq.FindBy(c => c.Name == "Company Inc")....
qui renvoie un IEnumberable en mémoire contenant un objet Company dont le nom est "Company Inc". Le test unitaire qui appelle SignupLogic.AddNewCompany crée une société avec des détails en double et essaie de la transmettre, et j'affirme qu'une ArgumentException est lancée avec le message "Company already exists". Ce test ne passe pas.
En déboguant le test unitaire et AddNewCompany() lors de son exécution, il semblerait que existingCompany soit toujours nul. En désespoir de cause, j'ai trouvé que si je mets à jour SignupLogic.AddNewCompany() de sorte que l'appel à FindBy ressemble à ceci :
Company existingCompany = this.repo.FindBy(c => c.Name == "Company Inc").FirstOrDefault();
le test passe, ce qui me suggère que Moq répond uniquement au code qui est exactement le même que celui que j'ai mis en place sur mon banc d'essai. Évidemment, ce n'est pas particulièrement utile pour tester que toute entreprise dupliquée est rejetée par SignupLogic.AddNewCompany.
J'ai essayé de configurer moq.FindBy(...) pour qu'il utilise "Is.ItAny", mais cela ne fait pas passer le test non plus.
D'après tout ce que je lis, il semblerait que tester les expressions comme j'essaie de le faire ne soit pas possible avec Moq. Est-ce possible ? Merci de m'aider !