Я попытался расширить расширение ICommandWrapper
, следуя этой статье: https://www.skyrise.tech/blog/tech/extending-nunit-3-with-command-wrappers/. Я понял, что могу также расширить TestAttribute
, и это просто работает, затем я попытался расширить TestCaseAttribute
:
[AttributeUsage(AttributeTargets.Method), AllowMultiple = true]
public class MyTestCaseAttribute : TestCaseAttribute, IWrapSetUpTearDown
{
private object[] _args;
public MyTestCaseAttribute(params object[] args) : base(args)
{
_args = args;
}
public TestCommand Wrap(TestCommand command)
{
return new MyTestCommand(command, _args);
}
}
MyTestCommand
расширяет DelegatingTestCommand
, как в статье.Проблема в том, что если я добавлю несколько MyTestCaseAttribute
s к методу теста, метод теста будет несколько раз обернут кодом MyTestCommand.Execute
.
[EDIT] Пример:
Предположим, MyTestCommand
выглядит следующим образом:
public abstract class MyCommandDecorator : DelegatingTestCommand
{
public override TestResult Execute(TestExecutionContext context)
private object[] _testCaseArgs;
protected TestCommandDecorator(TestCommand innerCommand, params object[] args) : base(innerCommand)
{
_testCaseArgs = args;
}
public override TestResult Execute(TestExecutionContext context)
{
DoSomething(_testCaseArgs);
return context.CurrentResult = innerCommand.Execute(context);
}
}
Предположим, я украшаю метод тестирования двумя [MyTestCase]
атрибутами:
[MyTestCase(1)]
[MyTestCase(2)]
public void MyTest(int foo)
{
//...
}
Требуемое поведение выглядит примерно так:
DoSomething(1);
MyTest(1);
DoSomething(2);
MyTest(2);
Но реальное поведение таково:
DoSomething(2)
DoSomething(1)
MyTest(1)
DoSomething(2)
DoSomething(1)
MyTest(1)