【问题标题】:Mocking with FakeItEasy and DBContext does not work用 FakeItEasy 和 DBContext 模拟不起作用
【发布时间】:2021-06-15 18:55:53
【问题描述】:

为什么这个测试代码不起作用?

测试类中的方法 CheckDbAsync():

public async Task<bool> CheckDbAsync()
{
return await DbContext
                    .GetDatabase()
                    .CanConnectAsync(default);
}   

使用 FakeItEasy 的测试代码:

var dbContext = A.Fake<IDbContext>();
           
A.CallTo(() => dbContext
                .GetDatabase()
                .CanConnectAsync(default))
                .Returns(Task.FromResult(true));


var tc= new Testclass(dbContext);

bool result=await tc.CheckDbAsync();

总是返回 false,而不是 true。

【问题讨论】:

  • 顺便说一句,如果您使用的是现代 FakeItEasy,您可以将 .Returns(Task.FromResult(true)) 替换为 .Returns(true)。我觉得它更具可读性,但您的口味可能会有所不同……

标签: c# mocking fakeiteasy


【解决方案1】:

IDbContextGetDatabase 是什么?我找不到这些东西的参考资料。也许是因为我不是 EntityFramework 用户,也许是因为它们是你自己的东西?回答这些问题时了解更多背景信息会很有帮助。

这里没什么可说的,但我猜:

GetDatabase 每次调用它时都会返回一个不同的对象。这是 FakeItEasy 伪造的未配置方法的标准行为。

所以你配置一个whatever-the-return-type-of-GetDatabase-is,然后在CheckDbAsync中使用另一个。

要验证,您可以检查对象的引用相等性。 作为补救措施,您可能希望将dbContext.GetDatabase 配置为始终返回相同的whatever-the-return-type-of-GetDatabase-is。

(观察到行为的另一个原因:测试类中的dbContext 和生产代码中的DBContext 之间没有联系。我们看到您将dbContext 传递给Testclass 构造函数,但我们没有不知道在那之后dbContext 会发生什么。或者即使CheckDbAsync 方法是同一个Testclass 类的一部分。我想是的,并且您只需将dbContext 存储在DbContext 属性中,但我不能确定,我想我会提到它,以防万一这是真正的问题。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多