Я попробовал решение, предоставленное @Marius I. Это работает, но я потерял свое описание, мои метас, теги и разрешения, которые я установил для старого экземпляра. Я должен был скопировать свои метас, должен был убедиться, что зона для нового экземпляра была такой же, как и оригинал, и должен был проверить, что цены были такими же.
Я думаю, что лучше всего создать клон вашего исходного экземпляра, таким образом не нужно вручную копировать / устанавливать их на новом экземпляре.
Все готово:)
Получается, что я искал метод ITestClassCommand.EnumerateTestMethods ().
В случае с моим примером выше мне понадобится что-то вроде:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class RunWithMyTestClassCommandAttribute : RunWithAttribute
{
public RunWithMyTestClassCommandAttribute()
: base(typeof(MyTestClassCommand)) {}
}
Затем я мог бы украсить мой приведенный выше пример:
[RunWithMyTestClassCommand]
public class AdditionSpecification
{
static int result;
public void Because()
{
result = 2 + 2;
}
public void Result_is_non_zero()
{
Assert.True(result <> 0);
}
public void Result_is_correct()
{
Assert.Equal(4, result);
}
}
Наконец, в MyTestClassCommand у меня есть возможность между EnumerateTestMethods () и EnumerateTestCommands (IMethodInfo testMethod), чтобы использовать любую логику, которую я хочу найти и создать экземпляры ITestCommand, которые выполняются как отдельные тесты.
Кстати, в процессе исследования. Эта проблема, Я столкнулся с небольшой ошибкой в платформе xUnit.NET, когда пользовательский IMethodInfo, сгенерированный EnumerateTestMethods (), никогда не появлялся в EnumerateTestCommands (..), потому что он разворачивался и повторно упаковывался средством выполнения тестов или одной из его фабрик.
Я отправил эту проблему в проект xUnit на codeplex, и она была исправлена 30 мая 2009 г. для xUnit.NET 1.5 CTP 2
IUseFixture xUnit.net позволяет выполнять настройку отдельных приборов. Таким образом, вы можете определить свой собственный класс фикстуры:
public class AdditionFixture : IDisposable
{
public int Because()
{
return 2 + 2;
}
public void Dispose()
{
//test tear down code
}
}
Затем ваш тестовый класс может реализовать это (с setFixture, требующим реализации):
public class AdditionSpecification : IUseFixture<AdditionFixture>
{
int result;
public void SetFixture(AdditionFixture Fixture)
{
result = Fixture.Because();
}
[Fact]
public void Result_is_non_zero()
{
Assert.True(result <> 0);
}
[Fact]
public void Result_is_correct()
{
Assert.Equal(4, result);
}
}
Средство запуска xUnit создаст единственный экземпляр вашего фикстуры и передаст его в SetFixture перед запуском каждого теста . После выполнения всех ваших тестов бегун избавится от фикстуры, если он реализует IDisposable. Надеюсь, это поможет!