2008-10-08 17 views
3

J'utilise Moq pour mocker ma couche Repository afin que je puisse tester l'unité.Mocking un changement d'attribut sur un paramètre - en utilisant Moq

Ma couche de référentiel Les méthodes d'insertion mettent à jour la propriété Id de mes entités lorsqu'une insertion db réussie se produit.

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

Code Repository: -

void IAccountRepository.InsertAccount(AccountEntity account); 

Unité de test: -

[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 de mise en œuvre de la classe marché de fournitures (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 peut faire un peu défaut. J'ai seulement commencé à apprendre des frameworks moq et moqueurs aujourd'hui. ac

Répondre

5

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 le bon sens.

+0

merci c'était utile pour moi – BigOmar

2

Je ne suis pas sûr de savoir comment cela fonctionnera, car compte est créé dans la méthode, il est donc pas le cas, je vais parler quand je mets la valeur d'ID à 1.

Peut-être il y a une faille dans ma conception et je devrais vérifier ID> 0 dans l'implémentation IAccountRepository.InsertAccount, puis renvoyer un booléen si c'est OK. Bien que j'ai un problème avec l'insertion d'un compte qui a un objet connexe qui doit être inséré (et un Id généré).

Je trouve que ce soit la réponse à mon problème

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

merci.