【问题标题】:Using AutoMoq methods with generic signatures使用具有通用签名的 AutoMoq 方法
【发布时间】:2015-10-20 23:18:48
【问题描述】:

我目前正在使用我使用 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>();
}

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

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

【问题讨论】:

    标签: autofixture automoq


    【解决方案1】:

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

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

    摘自here:

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

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

    【讨论】:

    • 对,我应该注意到我使用 AutoConfiguredMoqCustomizations 的方式。但是感谢您确认 AutoConfiguredMoqCustomizations 无法配置通用方法。所以看起来我无法避免进行某种级别的设置,但我至少可以避免使用 ReturnsUsingFixture 设置返回值。我会试试看。谢谢。
    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 2021-11-15
    • 2023-02-05
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2011-11-06
    相关资源
    最近更新 更多