发布模式下测试未使用Shimmed方法

6

在Visual Studio 2015中,我有一个测试项目,我向其中添加了一个虚假程序集。

在单元测试中,我创建了一个针对静态泛型方法的shim,该方法返回泛型类型的实例,例如:

using (ShimsContext.Create())
{
    ShimStaticClass.TheMethod<MyType>(() => instanceOfMyType);

    // ... code that uses StaticClass.TheMethod here ...
}

当以调试模式构建解决方案时,测试可以正常运行并通过。然而,当以发布模式构建解决方案时,被屏蔽的TheMethod版本不会被调用,这导致测试失败。

我知道被屏蔽的方法没有被调用,因为我已经通过以下方式将其更改为抛出异常:

using (ShimsContext.Create())
{
    ShimForStaticClass.TheMethod<MyType>(() => 
    {
        throw new InvalidOperationException("Shim was called");
    });

    // ... code that uses StaticClass.TheMethod here ...
}

并且这个异常没有被抛出。

我已经为该模拟开启了诊断日志和嘈杂的详细程度,但构建日志没有显示任何问题。


2
尝试在发布模式下关闭优化,重新构建并重新运行测试。可能编译器不认为需要调用该方法? - sQuir3l
因此,在测试项目中(引用了 Fakes)关闭发布模式下的优化并没有起作用。但是,当关闭包含被测试代码的项目的优化时,它确实起作用了。现在,我的假设是编译器正在内联调用 "StaticClass.TheMethod<MyType>",因为使用发布版本运行代码时,代码按预期执行。然而,我不认为关闭优化是这个可执行文件的有效解决方案。 - Chrisgh
2
这不是一个解决方案,但可能是朝着正确方向迈出的一步。你可以看看为什么它认为方法调用可以被跳过,可能有改进代码的空间。 - sQuir3l
1个回答

0
你尝试使用MethodImpl属性并传递ImplOptions.NoInlining了吗?
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]

不幸的是,被 shimmed 的方法位于第三方程序集中。 - Chrisgh
你尝试过使用装饰器并使用上述属性吗? - Randy
我考虑过这个方案,但没有尝试过。如果这种方法可行的话,在我的情况下它并不真正值得,因为我会以一种难以理解的方式进行编码,而我可以用更直接的方式来解决这个问题(至少在这个代码库中是这样的;显然比我发布的这个通用问题更具体实现) 。 - Chrisgh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接