如何模拟添加到 DbContext 的记录

How to mock a record getting added to the DbContext

我有这样的方法:

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

消息类型为 DbSet<Message>。因此,您需要创建 DbSet<Message> 的 fake/substitute 实例,并让 _dbContext.Messages.

返回 me
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