Moq qui pratiquent les méthodes d'où l'Expression<Func<T, bool>> sont passés en paramètres

Je suis très nouveau pour les tests unitaires et les moqueries! Je suis en train d'écrire des tests unitaires qui couvre une partie du 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 je suis en train de tester, en utilisant un béton Cio avais mise en œuvre de IRepository 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();
    }
}

De sorte que je suis en essais la logique de SignupLogic.AddNewCompany() elle-même, plutôt que de la logique et le béton Référentiel, je suis moqueur jusqu'IRepository et le passage dans SignupLogic. La maquette Référentiel ressemble à ceci:

Mock<Repository> repoMock = new Mock<Repository>();
repoMock.Setup(moq => moq.FindBy(c => c.Name == "Company Inc")....

qui renvoie à une mémoire IEnumberable contenant une Entreprise de l'objet avec le nom de "Company Inc". L'unité de test qui appelle SignupLogic.AddNewCompany met en place une société avec des doublons de détails et essaie de se passer que dans, et j'affirme que ArgumentException est levée avec le message "la Société existe déjà". Ce test n'est pas en passant.

De débogage par le biais de l'unité de test et de AddNewCompany (), car il s'exécute, il semblerait que existingCompany est toujours null. En désespoir de cause, j'ai trouvé que si je mettre à 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 laisse croire que Moq est seulement en répondant à un code qui est exactement le même que j'ai configuré dans mon installation de test. Évidemment, ce n'est pas particulièrement utile dans les essais que le double de l'entreprise est rejeté par SignupLogic.AddNewCompany.

J'ai essayé la configuration de moq.FindBy(...) à l'utilisation.ItAny", mais qui ne causent pas de test à passer.

De tout ce que je suis en train de lire, il semblerait que les tests de dépistage des Expressions que j'essaie de n'est pas vraiment faisable avec Moq ici. Est-il possible? S'il vous plaît aider!

  • Si votre objectif est de tester le retour, vous pouvez forcer votre Maquette cadre d'ignorer l'argument: se Moquer de.Organiser(() => repo.AllIncluding(x => x.Category == catégorie)) .IgnoreArguments() .Retourne (new List<Produit>{new Produit()}) .AsQueryable()); Dans l'exemple ci-dessus, je suis en utilisant une version gratuite de JustMock.
InformationsquelleAutor jonsidnell | 2011-03-04