2015-12-03 4 views
4

Я использую xUnit для тестирования моего приложения и в настоящее время настрою тест на использование атрибута [Theory] для тестирования нескольких разных входов данных.Используйте те же данные теста для нескольких прогонов теории xUnit

Для этого мне нужно создать тестовые данные в моем ранее обдуманном контексте данных. Это работает, но когда я добавляю данные в сам тест, каждый запуск заканчивается тем же самым добавлением данных.

Мой текущий тест:

[Theory] 
[InlineData(null, 2)] 
[InlineData("en-AU", 1)] 
public void Test1(string term, int expectedCount) 
{ 
    Fixture.DbContext.Culture.Add(new Culture { Name = "English (Australia)", CultureCode = "en-AU", NativeName = "English (Australia)"}); 
    Fixture.DbContext.Culture.Add(new Culture { Name = "English (United States)", CultureCode = "en-US", NativeName = "English (United States)" }); 
    Fixture.DbContext.Culture.Add(new Culture { Name = "English", CultureCode = "en", NativeName = "English", NeutralCultureFlag = true }); 

    var result = controller.GetRegions(term); 

    Assert.IsType(typeof (JsonResult), result); 
    var jsonResult = (JsonResult)result; 

    Assert.Equal(expectedCount, jsonResult.Data); 
} 

Есть ли способ только настройки тестовых данных, один раз для каждого прогона InlineData? Я знаю, что могу поместить его в конструктор тестового класса, но я бы предпочел не делать этого, поскольку это кажется ненужным, если это единственный тест в классе, который использует эти данные.

ответ

2

Есть ли способ настроить тестовые данные только для каждого запуска InlineData? ... если это единственный тест в классе, который использует эти данные.

Если я понять ситуацию правильно, я считаю, что искомый использовать XUnit-х Class Fixture (с использованием IClassFixture<> реализованных на тестовом классе), который может обеспечить логику одного теста контекста разделяемого среди теста (s) для одного класса, где необходимо. Затем очищается, когда все эти локальные тесты выполняются.

В противном случае, если мысль повторного использования, можно использовать Collection Fixture, когда один тестовый контекст должен быть создан один раз, а затем распространен среди множества различных тестовых классов, и как только все будет сделано, оно будет очищено.

Но вы упомянули, что можно использовать конструктор/распоряжаться и который будет создавать и уничтожать новый контекст для каждого теста этого класса; которые, как вы упомянули, являются отходами, когда используется только один тест.

Итак, у вас есть еще два варианта, которые могут обеспечить способ не оплачивать накладные расходы на создание и уничтожение контекста незадолго.


Эталонные


Заключительные мысли

Честно говоря, если это такой уникальный тэ st, почему это должно быть с набором теорий? Просто сделайте это индивидуальным тестом.

+0

Я использую прибор класса, в котором я делаю свое издевательство, но кажется, что это бесполезно использовать для настройки данных, которые могут использоваться только в одном тесте. – Steve

+0

@Steve Я полностью согласен ... см. Мои * Заключительные мысли * для ответа. – OmegaMan

+0

Я закончил тем, что добавлял данные в начале моего теста, а затем удалял данные в методе 'Dispose'. Таким образом, я только добавляю данные для этого теста и удаляю его. Не идеальное решение, но будет работать для меня. Благодарю. – Steve