Nancy OWIN 测试互动
Nancy OWIN test interaction
我想弄清楚为什么我们的集成测试不是独立的。
每个测试的基本部分是:
var builder = new ContainerBuilder();
// IoC registrations, typically SingleInstance lifetimes or RegisterInstance
var browser = new Browser(new CustomBootstrapper(builder));
// browser.Post...
// Assertions
每个测试都使用新的 ContainerBuilder 和 Browser 实例。
我们的一个测试在 运行 独立时通过,但如果 运行 与另一个类似测试一起失败。这发生在两个不同的测试 运行ners(TestDriven.Net 和 JetBrains)中。
检测,通过检查 HashCode,我可以看到第一个测试使用并由 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 class 中,两者都没有 setup/teardown:
[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
的后代。这里 post 太长了。)
我们的一位开发人员在我们的代码中发现了这个问题。
using Nancy.Authentication.Forms;
public class UserMapper : IUserMapper
{
public static IOrganizationService OrganizationService { get; set; }
// ...
}
IOrganizationService
的实现在其构造函数中注入了一个 OrganizationCache
。
static 字段是罪魁祸首。
我想弄清楚为什么我们的集成测试不是独立的。
每个测试的基本部分是:
var builder = new ContainerBuilder();
// IoC registrations, typically SingleInstance lifetimes or RegisterInstance
var browser = new Browser(new CustomBootstrapper(builder));
// browser.Post...
// Assertions
每个测试都使用新的 ContainerBuilder 和 Browser 实例。
我们的一个测试在 运行 独立时通过,但如果 运行 与另一个类似测试一起失败。这发生在两个不同的测试 运行ners(TestDriven.Net 和 JetBrains)中。
检测,通过检查 HashCode,我可以看到第一个测试使用并由 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 class 中,两者都没有 setup/teardown:
[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
的后代。这里 post 太长了。)
我们的一位开发人员在我们的代码中发现了这个问题。
using Nancy.Authentication.Forms;
public class UserMapper : IUserMapper
{
public static IOrganizationService OrganizationService { get; set; }
// ...
}
IOrganizationService
的实现在其构造函数中注入了一个 OrganizationCache
。
static 字段是罪魁祸首。