0

在类实例化和 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)特定测试方法或特定类定义时,所有测试都运行良好。

当我右键单击项目、包含测试的文件夹或上面类的命名空间定义时,测试失败。

错误是NullReferenceException,在进行断言时,它似乎是存根的数据。它是随机的,有时会Tests1.passing_test失败,有时会Tests2.passing_test失败。从不两者兼而有之。

认为它必须与RhinoAutoMocker和/或MockRepository在测试夹具之间不被重置?

更新:简化代码以显示问题,同时给出的代码是完整的,使用 NUnit[Test]而不是 XUnit[Fact]属性有效,一切正常。

4

1 回答 1

2

在您的示例中,您有两个单独的测试类。默认情况下,xUnit v2 将并行运行这些测试。

我遇到过同样的问题,但在我的情况下使用静态 MockRepository.GenerateMock。在并行测试中使用的静态类会导致异常。测试失败的看似随机性取决于首先运行哪些测试。

我可以看到有两种选择。1. 单个类中的测试 - 不太可行 2. 使用 XUnit Collection 属性将所有测试类放在同一个集合中 - 这对我有用。

见:http: //xunit.github.io/docs/running-tests-in-parallel.html

另一种选择是在测试程序集中使用以下属性关闭 xUnit 的并行性

[assembly: CollectionBehavior(DisableTestParallelization = true)]

于 2017-07-05T11:41:13.703 回答