使用具有通用签名的 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);
我目前正在使用我使用 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 theReturnsUsingFixture
extension method:converter.Setup(x => x.Convert<double>("10.0")) .ReturnsUsingFixture(fixture);