如何模拟添加到DbContext的记录

时间:2016-06-16 18:00:03

标签: c# entity-framework unit-testing nsubstitute

我有这样的方法:

private void CreateTaskFromModel(ForgotPasswordViewModel fpModel)
{
    var message = _dbContext.Create<Message>();

    message.MessageType = "TASK".PadLeft(10);
    message.Assigned_User_K = fpModel.SendPasswordRequestTo.Trim();
    message.Assigned_Date = DateTime.Today;
    message.Source_User_K = string.Empty;
    message.Title_Focus = "Request Web Password";

    _dbContext.Messages.Add(message);
}

所以我能够像这样嘲笑Create方法:

Message msg = new Message();
IMyDbContext fakeDbContext = NSubstitute.Substitute.For<IMyDbContext>();

fakeDbContext.Create<Message>().Returns(msg);

但请注意最后一行仍有此代码,我不知道如何模仿这个代码?

_dbContext.Messages.Add(message);

我正在使用NSubstittue

1 个答案:

答案 0 :(得分:4)

消息的类型为DbSet<Message>。因此,您需要创建DbSet<Message>的假/替代实例,并让我通过_dbContext.Messages返回。

Message msg = new Message();
IMyDbContext fakeDbContext = NSubstitute.Substitute.For<IMyDbContext>();

var messagesSet = NSubstitute.Substitute.For<DbSet<Message>>();
fakeDbContext.Create<Message>().Returns(msg);
fakeDbContext.Messages.Returns(messagesSet);

您也有兴趣了解是否调用了Add。您可以在断言中执行此操作。

messagesSet.Received().Add(NSubstitute.Any<Message>());

或者如果您想测试是否从创建

添加了相同的实例
messagesSet.Received().Add(msg); // message created earlier in your test