我目前正在使用测试框架,我使用xUnit,AutoMoq,AutoFixture和AutoFixture.XUnit2将它们放在一起。我遇到了使用通用签名的模拟方法的问题。
AutoFixture似乎处理通用项目就好了。如果我要求CustomeObject<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>();
}
在此代码中,结果将为null。这对我来说似乎很奇怪。它不应该进入自动混合并尝试创建类型T的值,即新的字符串吗?似乎Autofixture已经证明它可以很好地处理泛型。
或者您是否总是只需手动设置其签名中具有通用名称的任何模拟方法?
答案 0 :(得分:4)
默认情况下,模拟对象不会通过AutoFixture。尽管如此,您可以使用AutoConfiguredMoqCustomization
。
但是,在您的情况下,该方法是通用的。
AutoConfiguredMoqCustomization
不适用于通用方法,您必须手动设置方法。
摘自here:
AutoConfiguredMoqCustomization
也没有配置泛型方法。但是,您可以使用ReturnsUsingFixture
扩展方法轻松设置它们:converter.Setup(x => x.Convert<double>("10.0")) .ReturnsUsingFixture(fixture);