使用 FakeItEasy 和 DBContext 进行模拟不起作用

Mocking with FakeItEasy and DBContext does not work

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

测试中的方法 CheckDbAsync()-Class:

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();

总是returns错误,不正确。

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

这里没有太多内容,但我猜:

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

所以你配置了一个什么-return-type-of-GetDatabase-is,然后另一个在 CheckDbAsync.

中使用

要验证,您可以检查对象的引用是否相等。 为了解决这个问题,您可能需要将 dbContext.GetDatabase 配置为始终 return 相同的 return-GetDatabase 类型。

(观察到的行为的另一个原因:测试 class 中的 dbContext 和生产代码中的 DBContext 之间没有联系。我们看到你通过了 dbContext 进入 Testclass 构造函数,但我们不知道 dbContext 之后会发生什么。或者即使 CheckDbAsync 方法是相同的 Testclass [=36] 的一部分=]。我想是的,你只是将 dbContext 存储在 DbContext 属性 中,但我不能确定,我想我会提到它,只是万一那才是真正的问题。)