C# 模拟参数上的属性更改-使用Moq

C# 模拟参数上的属性更改-使用Moq,c#,tdd,mocking,moq,C#,Tdd,Mocking,Moq,我正在使用Moq模拟我的存储库层,以便进行单元测试 成功插入数据库时,我的存储库层插入方法将更新实体的Id属性 调用Insert方法时,如何配置moq以更新实体的Id属性 存储库代码:- void IAccountRepository.InsertAccount(AccountEntity account); 单元测试:- [TestInitialize()] public void MyTestInitialize() { accountRepository = new Mock&

我正在使用Moq模拟我的存储库层,以便进行单元测试

成功插入数据库时,我的存储库层插入方法将更新实体的Id属性

调用Insert方法时,如何配置moq以更新实体的Id属性

存储库代码:-

void IAccountRepository.InsertAccount(AccountEntity account);
单元测试:-

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

如果这些信息可能有点不足,我深表歉意。我今天才开始学习moq和mocking框架。ac

您可以使用回调方法模拟副作用。比如:

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

这是未经测试的,但它是正确的。

我不确定这将如何工作,因为account是在方法内部创建的,所以当我将ID的值设置为1时,它不是我将要引用的实例

也许我的设计中存在缺陷,我应该检查IAccountRepository.InsertAccount实现中的ID>0,然后返回bool(如果可以)。不过,我在插入一个帐户时遇到了一个问题,该帐户有一个需要插入的相关对象(以及一个生成的Id)

我发现这就是我问题的答案

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

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