无法使用从 RhinoMocks 存根生成的 TestCaseData 运行测试

本文关键字:TestCaseData 运行测试 存根 RhinoMocks | 更新日期: 2023-09-27 18:37:24

我正在使用Visual Studio 2015社区中的C#,使用NUnit3Rhino Mocks,并尝试为我的系统组件编写测试(它不是单元测试)。

尝试使用生成的存根作为提供给TestCaseSourceTestCaseData的参数时,我遇到了问题。我在输出窗口中收到以下错误:

Test adapter sent back a result for an unknown test case. Ignoring result for 'MyTest(Castle.Proxies.IMyInterfaceProxy4c6c716794ef48818f41fd5012345ead)'.
Test adapter sent back a result for an unknown test case. Ignoring result for 'MyTest(Castle.Proxies.IMyInterfaceProxy4c6c716794ef48818f41fd5012345ead)'.

当我重建测试项目时,测试名称出现在VS2015集成测试运行程序中,但是一旦我尝试运行它,它就会变灰。

这里有一些基于我的测试代码的示例代码:

using NUnit.Framework;
using Rhino.Mocks;
using System.Collections;
namespace FenixLib.Core.Tests
{
    public interface IMyInterface
    {
        int Property { get; }
    }
    [TestFixture]
    class TestMocks
    {
        [Test, TestCaseSource( "TestCases" )]
        public void MyTest(IMyInterface what)
        {
            // Do stuff
        }
        public static IEnumerable TestCases()
        {
            yield return new TestCaseData ( CreateFake ( 2 ) );
            yield return new TestCaseData ( CreateFake ( 4 ) );
        }
        public static IMyInterface CreateFake ( int something )
        {
            var fake = MockRepository.GenerateStub<IMyInterface> ();
            fake.Stub ( x => x.Property ).Return ( something );
            return fake;
        }
    }
}

如果我创建一个包装生成的存根的装饰器类,我已经能够克服这个问题:

public class Decorator : IMyInterface
{
    IMyInterface decorated;
    public Decorator ( IMyInterface decorated )
    {
        this.decorated = decorated;
    }
    public int Property
    {
        get
        {
            return decorated.Property;
        }
    }
}

并通过return new Decorator ( fake );更改先前的return fake;.那么一切正常。

然而,这在我的真实场景中有点痛苦,因为我的接口不仅像这个例子一样具有单个属性,而且更复杂(是的,我知道VS2015可以生成代码以通过装饰字段实现,但这不是重点)。此外,如果我最终要创建我希望不完全实现用于测试目的的接口的实现,那么使用 RinhoMocks 感觉毫无意义。

无论如何,让我烦恼的是我不明白为什么它不起作用,因此我问:

谁能帮助我理解为什么没有装饰器的代码不起作用?

无法使用从 RhinoMocks 存根生成的 TestCaseData 运行测试

在发现时,TestExplorer 会创建一个进程,并要求我们的适配器查找测试。您的 TestCaseSource 方法运行并生成案例。它有一个由 Moq 生成的名称。

在程序生存期的后期,测试由 Visual Studio 执行,该工作室会创建一个不同的进程并要求适配器运行测试。由于我们在新进程中运行,因此适配器必须发现(即生成)所有情况。最有可能的是,Moq 使用不同的名称生成它们。最初创建的案例永远不会运行,NUnit 运行这些新案例,从 TestExplorer 的角度来看,这些案例从一开始就没有被发现。

我以前没有见过这种症状,但我们有一个类似的问题,即在执行时重新生成随机参数。这本质上是体系结构的问题,只有当适配器可以以某种方式保留最初加载的测试程序集以供执行过程找到时,才能解决。