2008-10-08 7 views
3

단위 테스트를 할 수 있도록 Moq를 사용하여 저장소 계층을 조롱했습니다.Moch를 사용하여 매개 변수에 대한 속성 변경 조롱

내 리포지토리 레이어 Insert 메서드는 성공적인 db 삽입이 발생할 때 내 엔터티의 Id 속성을 업데이트합니다.

Insert 메서드가 호출 될 때 moq가 엔터티의 Id 속성을 업데이트하도록 구성하려면 어떻게해야합니까?

저장소 코드 : -

void IAccountRepository.InsertAccount(AccountEntity account); 

단위 테스트 : - ContractService 클래스 (WCF 서비스 계약)에서

[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); 
} 

구현 조각.

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 
} 

이 정보가 약간 부족한 경우 사과드립니다. 나는 오늘 moq를 배우기 시작하고 프레임 워크를 조롱하기 시작했습니다. ac

답변

5

콜백 메서드를 사용하여 부작용을 모의 할 수 있습니다. 다음과 같음 :

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

제대로 테스트되지 않았지만 올바른 라인을 따라 있습니다.

+0

감사합니다. 도움이되었습니다. – BigOmar

2

나는 계정이 방법 내에서 만들어지기 때문에 그 작동 방식을 잘 모르겠어요, 그래서 내가

는 아마도 결함 거기에 내가 1로 ID의 값을 설정할 때 참조 할 수 있습니다 인스턴스 아니다 내 디자인 및 IAccountRepository.InsertAccount 구현 내에서 ID> 0 확인하고 괜찮 으면 bool 반환합니다. 그럼에도 불구하고 나는 insterted 될 필요가있는 관련 객체를 가지고있는 계정을 삽입하는 것에 문제가있다. (그리고 Id는 genereated된다.)

나는이 내 문제

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

덕분에 해답이 될 것을 알았다.