无法 运行 使用从 RhinoMocks 存根生成的 TestCaseData 进行测试
Impossible to run test with TestCaseData generated from RhinoMocks stub
我在 Visual Studio 2015 Community 中使用 C#,使用 NUnit3 和 Rhino Mocks 并尝试为我的系统组件编写测试(这不是单元测试)。
我在尝试使用生成的存根作为提供给 TestCaseSource
的 TestCaseData
的参数时遇到了问题。我在输出 window:
中收到以下错误
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集成测试-运行ner在我重建测试项目时出现了测试名称,但是我一尝试运行它就变灰了。
这里有一些基于我的测试代码的示例代码:
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;
}
}
}
如果我创建一个包装生成的存根的装饰器class,我就能够解决这个问题:
public class Decorator : IMyInterface
{
IMyInterface decorated;
public Decorator ( IMyInterface decorated )
{
this.decorated = decorated;
}
public int Property
{
get
{
return decorated.Property;
}
}
}
并将先前的 return fake;
更改为 return new Decorator ( fake );
。那么一切正常。
然而,这在我的真实场景中有点痛苦,因为我的界面不仅像本例中那样只有一个 属性,而且更复杂(是的,我知道 VS2015 可以生成代码通过装饰字段实现,但这不是重点)。此外,如果我最终要创建一个我不希望完全实现的接口实现用于我的测试目的,那么使用 RinhoMocks 感觉毫无意义。
无论如何,让我烦恼的是我不明白为什么它不起作用,因此我问:
谁能帮我理解为什么没有装饰器的代码不起作用?
在发现时,TestExplorer 创建一个进程并要求我们的适配器查找测试。您的 TestCaseSource 方法 运行s 并生成案例。它有一个由 Moq 生成的名称。
在程序生命周期的很久以后,您的测试由 Visual studio 执行,它创建了一个 不同的 进程并要求适配器 运行测试。由于我们 运行ning 在一个新进程中,适配器必须发现(即生成)所有案例。最有可能的是,Moq 使用不同的名称生成它们。最初创建的案例从来没有 运行 和 NUnit 运行 这些新案例,从 TestExplorer 的角度来看,这些新案例一开始就没有被发现。
我以前从未见过这种症状,但我们遇到了类似的问题,即在执行时重新生成随机参数。这本质上是架构问题,只有当适配器能够以某种方式保留最初加载的测试程序集以供执行过程找到时才能解决。
我在 Visual Studio 2015 Community 中使用 C#,使用 NUnit3 和 Rhino Mocks 并尝试为我的系统组件编写测试(这不是单元测试)。
我在尝试使用生成的存根作为提供给 TestCaseSource
的 TestCaseData
的参数时遇到了问题。我在输出 window:
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集成测试-运行ner在我重建测试项目时出现了测试名称,但是我一尝试运行它就变灰了。
这里有一些基于我的测试代码的示例代码:
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;
}
}
}
如果我创建一个包装生成的存根的装饰器class,我就能够解决这个问题:
public class Decorator : IMyInterface
{
IMyInterface decorated;
public Decorator ( IMyInterface decorated )
{
this.decorated = decorated;
}
public int Property
{
get
{
return decorated.Property;
}
}
}
并将先前的 return fake;
更改为 return new Decorator ( fake );
。那么一切正常。
然而,这在我的真实场景中有点痛苦,因为我的界面不仅像本例中那样只有一个 属性,而且更复杂(是的,我知道 VS2015 可以生成代码通过装饰字段实现,但这不是重点)。此外,如果我最终要创建一个我不希望完全实现的接口实现用于我的测试目的,那么使用 RinhoMocks 感觉毫无意义。
无论如何,让我烦恼的是我不明白为什么它不起作用,因此我问:
谁能帮我理解为什么没有装饰器的代码不起作用?
在发现时,TestExplorer 创建一个进程并要求我们的适配器查找测试。您的 TestCaseSource 方法 运行s 并生成案例。它有一个由 Moq 生成的名称。
在程序生命周期的很久以后,您的测试由 Visual studio 执行,它创建了一个 不同的 进程并要求适配器 运行测试。由于我们 运行ning 在一个新进程中,适配器必须发现(即生成)所有案例。最有可能的是,Moq 使用不同的名称生成它们。最初创建的案例从来没有 运行 和 NUnit 运行 这些新案例,从 TestExplorer 的角度来看,这些新案例一开始就没有被发现。
我以前从未见过这种症状,但我们遇到了类似的问题,即在执行时重新生成随机参数。这本质上是架构问题,只有当适配器能够以某种方式保留最初加载的测试程序集以供执行过程找到时才能解决。