Nancy OWIN测试互动

时间:2016-04-11 00:05:14

标签: c# nunit owin autofac nancy

我试图找出为什么我们的集成测试不是独立的。

每项测试的基本部分是:

var builder = new ContainerBuilder();
// IoC registrations, typically SingleInstance lifetimes or RegisterInstance
var browser = new Browser(new CustomBootstrapper(builder));
// browser.Post...
// Assertions

每个测试都使用新的ContainerBuilder和Browser实例。

我们的一个测试在独立运行时通过,但如果与另一个类似测试一起运行则会失败。这发生在两个不同的测试运行器(TestDriven.Net和JetBrains)中。

检测,我可以通过检查HashCodes看到第一次测试使用并由IoC容器注入的对象出现在第二次测试中(并且与那里创建的对象不匹配)。在错误的对象上调用方法,因此测试失败。

代码不使用静态成员。

我是否误解了Nancy,Nancy.Testing或OWIN的工作方式?这些测试如何相互影响?

根据请求,更多详情:

[Test]
public void Test1()
{
    var organizationCache = new OrganizationCache();
    // Logs Creating OrganizationCache with HashCode:43641814 (varies by run)
    organizationCache.AddOrganization(organization);
    ContainerBuilder builder = AutofacTestContainerBuilderFactory.CreateTestContainerBuilder();
    builder.RegisterInstance(organizationCache);
    var browser = new Browser(new CustomBootstrapper(builder));

    BrowserResponse browserResponse = browser.Post(
        "/api/...",
        with => with.JsonBody(model));

    browserResponse.StatusCode.ShouldBe(HttpStatusCode.OK);
}

在单独的TestFixture类中,没有设置/拆除:

[Test]
public void Test2()
{
    var organizationCache = new OrganizationCache();
    // Logs Creating OrganizationCache with HashCode:5337202 (varies by run)
    organizationCache.AddOrganization(organization);
    ContainerBuilder builder = AutofacTestContainerBuilderFactory.CreateTestContainerBuilder();
    builder.RegisterInstance(organizationCache);
    var browser = new Browser(new CustomBootstrapper(builder));

    TestHelpers.Authenticate(browser);  // log in (does a browser.Post)

    BrowserResponse browserResponse = browser.Post(
        "/api/...",
        with => with.JsonBody(model));

    browserResponse.StatusCode.ShouldBe(HttpStatusCode.Created);

    // Passes if run independently, fails if run with other test
    // When run with other test, system under test logs both OrganizationCache HashCodes during this test
}

CookieBasedSessions可能会以某种方式影响这个吗? (注意:我尝试单独删除CookieBasedSessions.Enable和 - 一起 - 在管道中创建新的Session;这不会影响问题。)

每次测试后处理customBootstrapper也没有任何区别。

CustomBootstrapper没有静态字段,而是来自AutofacNancyBootstrapper。此处发布的时间太长了。)

1 个答案:

答案 0 :(得分:0)

我们的一位开发人员在我们的代码中发现了这个问题。

using Nancy.Authentication.Forms;

public class UserMapper : IUserMapper
{
    public static IOrganizationService OrganizationService { get; set; }
    // ...
}

IOrganizationService的实现在其构造函数中注入了OrganizationCache

静态字段是罪魁祸首。