使用具有通用签名的 AutoMoq 方法

Using AutoMoq methods with generic signatures

我目前正在使用我使用 xUnit、AutoMoq、AutoFixture 和 AutoFixture.XUnit2 组合在一起的测试框架。我 运行 遇到具有通用签名的模拟方法的问题。

AutoFixture 似乎可以很好地处理通用项目。如果我要求 CustomeObject<Task<List<Task<string>>>> 或其他一些可笑的嵌套泛型类型,它似乎会按预期生成它们,一直到最后一个节点。

但是,如果我有这样的界面:

public interface ITestInterface{
    T Get<T>();
}

然后尝试从我从 AutoMoq 获得的模拟中调用方法,它只是 returns null。所以,例如:

[Theory]
[MyAutoDaqaAttribute]
public async Task ATest(
    Mock<ITestInterface> service
) {
    var result = service.Object.Get<string>();
}

在此代码中,结果将为空。这对我来说似乎很奇怪。它不应该去 autofixture 并尝试创建一个 T 类型的值,即一个新字符串吗? Autofixture 似乎已经表明它可以很好地处理泛型。

或者您总是只需要手动设置任何在其签名中具有泛型的模拟方法吗?

默认情况下模拟对象不会通过 AutoFixture。不过,您可以使用 AutoConfiguredMoqCustomization

但是,对于您的情况,该方法是通用的。 AutoConfiguredMoqCustomization 不适用于通用方法,您必须手动设置该方法。

摘自here

AutoConfiguredMoqCustomization does not configure generic methods either. You can, however, easily set these up using the ReturnsUsingFixture extension method:

converter.Setup(x => x.Convert<double>("10.0"))
         .ReturnsUsingFixture(fixture);