2

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

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

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

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

然后尝试从我从 AutoMoq 获得的模拟中调用该方法,它只返回 null。因此,例如:

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

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

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

4

1 回答 1

4

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

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

从这里提取:

AutoConfiguredMoqCustomization也不配置泛型方法。ReturnsUsingFixture但是,您可以使用扩展方法轻松设置它们:

converter.Setup(x => x.Convert<double>("10.0"))
         .ReturnsUsingFixture(fixture);
于 2015-10-21T00:43:10.623 回答