2016-04-11 7 views
2

Я пытаюсь понять, почему наши интеграционные тесты не являются независимыми.Nancy OWIN тестовое взаимодействие

Существенная часть каждого теста:

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

Каждый тест использует свежие ContainerBuilder и браузера экземпляров.

Один из наших тестов проходит при запуске независимо, но не работает, если выполняется вместе с другим аналогичным тестом. Это происходит в двух разных тестовых роликах (TestDriven.Net и JetBrains).

Прибор, я могу проверить, проверив HashCodes, что объект, используемый первым тестом и инъецируемый контейнером IoC, появляется во втором тесте (и не соответствует созданному там объекту). Методы вызываются на неправильный объект, поэтому тест не выполняется.

Код не использует статические элементы.

Я что-то не понимаю о том, как работает Нэнси, Нэнси. Испытание или 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. Это слишком долго, чтобы разместить сообщение.)

+0

Вы используете [TearDown] (http://nunit.org/index.php?p=teardown&r=2.6.4) для очистки этих тестов и настройки для их инициализации или это сидение в методе? – lloyd

+0

Не могли бы вы показать еще какой-нибудь код? То есть, что-то неудобно, что ломается, и unittest, который заставляет другого сломаться, когда бегают togheter? Также используйте методы настройки и удаления, если вы используете это. – andreasnico

+0

Что @andreasnico говорит – Jon

ответ

0

Один из наших разработчиков нашел проблему в нашем коде.

using Nancy.Authentication.Forms; 

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

Реализация IOrganizationService имеет OrganizationCache, впрыскиваемого в его конструктор.

статическое поле было преступником.

Смежные вопросы