XUnit、RhinoMocks 或 TestDriven.Net 问题
XUnit, RhinoMocks, or TestDriven.Net Issue
我在思考 class 实例化和 TestDriven.Net(v4.0.3478) 或 XUnit(v2.2.0)、RhinoMocks(v3.6.1) 和 structuremap.automocking 时遇到了一些问题(v4.0.0.315).
鉴于此代码:
public class Tests1
{
[Fact]
public void passing_test()
{
var mocker = new RhinoAutoMocker<Subject>();
mocker.Get<IData>().Stub(x => x.Strings).Return(new List<string> {""});
var result = mocker.ClassUnderTest.GetStrings();
result.Count().ShouldEqual(1);
}
}
public class Tests2
{
[Fact]
public void passing_test()
{
var mocker = new RhinoAutoMocker<Subject>();
mocker.Get<IData>().Stub(x => x.Strings).Return(new List<string> {""});
var result = mocker.ClassUnderTest.GetStrings();
result.Count().ShouldEqual(1);
}
}
public class Subject
{
private readonly IData _data;
public Subject(IData data)
{
_data = data;
}
public IEnumerable<string> GetStrings()
{
return _data.Strings;
}
}
public interface IData
{
IEnumerable<string> Strings { get; set; }
}
当我右键单击 -> Run Test(s)
特定测试方法或特定 class 定义时,所有测试 运行 正常。
当我右键单击项目、包含测试的文件夹或上面 class 的命名空间定义时,测试失败。
错误是NullReferenceException
,做断言的时候,好像是存根的数据。它是随机的,有时 Tests1.passing_test
失败,有时 Tests2.passing_test
失败。从来没有。
认为它必须与 RhinoAutoMocker
and/or MockRepository
不在测试装置之间重置?
更新:简化代码以显示问题,还给出了完整的代码,使用 NUnit [Test]
而不是 XUnit [Fact]
属性有效,一切正常。
在您的示例中,您有两个单独的测试 classes。
默认情况下,xUnit v2 将 运行 并行进行这些测试。
我遇到过同样的问题,但在我的情况下使用静态 MockRepository.GenerateMock。
在并行测试中使用的静态 class 会导致异常。
测试失败的随机性取决于先进行哪些测试 运行。
我可以看到两种选择。
1. 单次测试 class - 不太可行
2. 使用 XUnit Collection 属性将所有测试 classes 放在同一个集合中 - 这对我有用。
参见:http://xunit.github.io/docs/running-tests-in-parallel.html
另一种方法是在测试程序集中使用以下属性关闭 xUnit 的并行性
[assembly: CollectionBehavior(DisableTestParallelization = true)]
我在思考 class 实例化和 TestDriven.Net(v4.0.3478) 或 XUnit(v2.2.0)、RhinoMocks(v3.6.1) 和 structuremap.automocking 时遇到了一些问题(v4.0.0.315).
鉴于此代码:
public class Tests1
{
[Fact]
public void passing_test()
{
var mocker = new RhinoAutoMocker<Subject>();
mocker.Get<IData>().Stub(x => x.Strings).Return(new List<string> {""});
var result = mocker.ClassUnderTest.GetStrings();
result.Count().ShouldEqual(1);
}
}
public class Tests2
{
[Fact]
public void passing_test()
{
var mocker = new RhinoAutoMocker<Subject>();
mocker.Get<IData>().Stub(x => x.Strings).Return(new List<string> {""});
var result = mocker.ClassUnderTest.GetStrings();
result.Count().ShouldEqual(1);
}
}
public class Subject
{
private readonly IData _data;
public Subject(IData data)
{
_data = data;
}
public IEnumerable<string> GetStrings()
{
return _data.Strings;
}
}
public interface IData
{
IEnumerable<string> Strings { get; set; }
}
当我右键单击 -> Run Test(s)
特定测试方法或特定 class 定义时,所有测试 运行 正常。
当我右键单击项目、包含测试的文件夹或上面 class 的命名空间定义时,测试失败。
错误是NullReferenceException
,做断言的时候,好像是存根的数据。它是随机的,有时 Tests1.passing_test
失败,有时 Tests2.passing_test
失败。从来没有。
认为它必须与 RhinoAutoMocker
and/or MockRepository
不在测试装置之间重置?
更新:简化代码以显示问题,还给出了完整的代码,使用 NUnit [Test]
而不是 XUnit [Fact]
属性有效,一切正常。
在您的示例中,您有两个单独的测试 classes。 默认情况下,xUnit v2 将 运行 并行进行这些测试。
我遇到过同样的问题,但在我的情况下使用静态 MockRepository.GenerateMock。 在并行测试中使用的静态 class 会导致异常。 测试失败的随机性取决于先进行哪些测试 运行。
我可以看到两种选择。 1. 单次测试 class - 不太可行 2. 使用 XUnit Collection 属性将所有测试 classes 放在同一个集合中 - 这对我有用。
参见:http://xunit.github.io/docs/running-tests-in-parallel.html
另一种方法是在测试程序集中使用以下属性关闭 xUnit 的并行性
[assembly: CollectionBehavior(DisableTestParallelization = true)]