Question

J'utilise Moq pour simuler ma couche de référentiel afin de pouvoir effectuer des tests unitaires.

Les méthodes d'insertion de ma couche de référentiel mettent à jour la propriété Id de mes entités lorsqu'une insertion de base de données réussie.

Comment configurer moq pour mettre à jour la propriété Id de l'entité lorsque la méthode Insert est appelée?

Code du référentiel: -

void IAccountRepository.InsertAccount(AccountEntity account);

Test unitaire: -

[TestInitialize()]
public void MyTestInitialize() 
{
    accountRepository = new Mock<IAccountRepository>();
    contactRepository = new Mock<IContactRepository>();
    contractRepository = new Mock<IContractRepository>();
    planRepository = new Mock<IPlanRepository>();
    generator = new Mock<NumberGenerator>();

    service = new ContractService(contractRepository.Object, accountRepository.Object, 
                    planRepository.Object, contactRepository.Object, generator.Object);   
}


[TestMethod]
public void SubmitNewContractTest()
{
    // Setup Mock Objects
    planRepository
        .Expect(p => p.GetPlan(1))
        .Returns(new PlanEntity() { Id = 1 });

    generator
        .Expect(p => p.GenerateAccountNumber())
        .Returns("AC0001");

    // Not sure what to do here? 
    // How to mock updating the Id field for Inserts?
    //                                                 
    // Creates a correctly populated NewContractRequest instance
    NewContractRequest request = CreateNewContractRequestFullyPopulated();

    NewContractResponse response = service.SubmitNewContract(request);
    Assert.IsTrue(response.IsSuccessful);
}

extrait d'implémentation de la classe ContractService (contrat de service WCF).

AccountEntity account = new AccountEntity()
{
    AccountName = request.Contact.Name,
    AccountNumber = accountNumber,
    BillingMethod = BillingMethod.CreditCard,
    IsInvoiceRoot = true,
    BillingAddressType = BillingAddressType.Postal,
    ContactId = request.Contact.Id.Value
};

accountRepository.InsertAccount(account);
if (account.Id == null)
{
    // ERROR
}

Je m'excuse si cette information manque un peu. J'ai seulement commencé à apprendre les moq et les frameworks moqueurs aujourd'hui. ac

Était-ce utile?

La solution

Vous pouvez utiliser la méthode de rappel pour simuler des effets secondaires. Quelque chose comme:

accountRepository
    .Expect(r => r.InsertAccount(account))
    .Callback(() => account.ID = 1);

Cela n'a pas été testé, mais c'est dans la bonne direction.

Autres conseils

Je ne sais pas comment cela fonctionnera, car le compte est créé dans la méthode. Ce n'est donc pas l'instance à laquelle je me référerai lorsque je définirai la valeur de l'ID à 1.

Il y a peut-être un défaut dans ma conception et je devrais être en train de vérifier l'ID > 0 dans l'implémentation IAccountRepository.InsertAccount, puis en renvoyant une valeur booléenne si tout va bien. J'ai un problème avec l'insertion d'un compte associé à un objet à instancier (et à un identifiant généré).

J'ai trouvé que c'était la solution à mon problème

accountRepository
    .Expect(p => p.InsertAccount(It.Is<AccountEntity>(x => x.Id == null)))
    .Callback<AccountEntity>(a => a.Id = 1);

merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top