我可以将委托传递给 Xunit 理论吗
Can I pass a deligate to a Xunit Theory
我有兴趣在多个 类 上重复使用测试理论,特别是需要相同测试的多个构造函数。我最初有使用委托来执行此功能的想法。
但是,我认为我可能正在尝试重新发明轮子,尽管 C# 具有一些功能,但我认为我正在尝试一种不正确的方法。对于这种事情,是否有使用比 InlineData 更正确的方法的受支持方法。
InlineData 似乎用于注入输入,因此我可能会测试给定测试的许多示例。但是我可以为几种方法提供几个变量并进行测试 ^x 而不是 *x
[Theory]
[InlineData(input => new ConcreteConstructor(input)) ]
public void Constructor_Should_Not_Throw_Expection (Action<string>)
{
constructor("SomeString");
}
N.B 我想我应该在这种情况下使用 Func
作为返回对象。无论如何,我怀疑这完全是错误的做法,所以这不是主要考虑因素。
继承公共抽象的一个解决方案class:
abstract public class CommonTest_ConstructorShould
{
public abstract void Constructor(string input);
[Fact]
public void Constructor_Should_Not_Throw_Expection()
{
Constructor(System.IO.Directory.GetCurrentDirectory());
}
[Fact]
public void Constructor_Should_Throw_Exception()
{
Assert.Throws<ArgumentException>(() => Constructor("/PPPPPPPPPPPPPPPPPPPPPPP"));
}
}
public class LunarCalendarClient_ConstructorShould : LocalJsonClient_ConstructorShould
{
override public void Constructor(string input){
new ConcreteClass(input);
}
}
public static IEnumerable<object[]> TestData()
{
Action<string> a1 = input => new ConcreteConstructor(input);
yield return new object[] { a1 };
Action<string> a2 = input => new AnotherConstructor(input);
yield return new object[] { a2 };
}
[Theory]
[MemberData(nameof(TestData))]
public void Constructor_Should_Not_Throw_Expection(Action<string> constructor)
{
constructor("SomeString");
}
感谢 Yevheniy Tymchishin for his ,我想添加其他方法,以防万一有人想添加委托而不在 yield return.
之外声明新对象
static IEnumerable<object[]> Data
{
get
{
//Yevheniy's approach
Action<string> a1 = input => Construct(input);
yield return new object[] { a1 };
//new approach with hidden parameter
yield return new object[] {new Action<string> (Construct)};
//same but with exposed parameter syntax
yield return new object[] {new Action<string> ((input) => Construct(input))};
}
}
他们三个都做完全相同的事情,只是语法不同,相同的逻辑将适用于任何其他委托类型(func 或其他)
我有兴趣在多个 类 上重复使用测试理论,特别是需要相同测试的多个构造函数。我最初有使用委托来执行此功能的想法。
但是,我认为我可能正在尝试重新发明轮子,尽管 C# 具有一些功能,但我认为我正在尝试一种不正确的方法。对于这种事情,是否有使用比 InlineData 更正确的方法的受支持方法。
InlineData 似乎用于注入输入,因此我可能会测试给定测试的许多示例。但是我可以为几种方法提供几个变量并进行测试 ^x 而不是 *x
[Theory]
[InlineData(input => new ConcreteConstructor(input)) ]
public void Constructor_Should_Not_Throw_Expection (Action<string>)
{
constructor("SomeString");
}
N.B 我想我应该在这种情况下使用 Func
作为返回对象。无论如何,我怀疑这完全是错误的做法,所以这不是主要考虑因素。
继承公共抽象的一个解决方案class:
abstract public class CommonTest_ConstructorShould
{
public abstract void Constructor(string input);
[Fact]
public void Constructor_Should_Not_Throw_Expection()
{
Constructor(System.IO.Directory.GetCurrentDirectory());
}
[Fact]
public void Constructor_Should_Throw_Exception()
{
Assert.Throws<ArgumentException>(() => Constructor("/PPPPPPPPPPPPPPPPPPPPPPP"));
}
}
public class LunarCalendarClient_ConstructorShould : LocalJsonClient_ConstructorShould
{
override public void Constructor(string input){
new ConcreteClass(input);
}
}
public static IEnumerable<object[]> TestData()
{
Action<string> a1 = input => new ConcreteConstructor(input);
yield return new object[] { a1 };
Action<string> a2 = input => new AnotherConstructor(input);
yield return new object[] { a2 };
}
[Theory]
[MemberData(nameof(TestData))]
public void Constructor_Should_Not_Throw_Expection(Action<string> constructor)
{
constructor("SomeString");
}
感谢 Yevheniy Tymchishin for his
static IEnumerable<object[]> Data
{
get
{
//Yevheniy's approach
Action<string> a1 = input => Construct(input);
yield return new object[] { a1 };
//new approach with hidden parameter
yield return new object[] {new Action<string> (Construct)};
//same but with exposed parameter syntax
yield return new object[] {new Action<string> ((input) => Construct(input))};
}
}
他们三个都做完全相同的事情,只是语法不同,相同的逻辑将适用于任何其他委托类型(func 或其他)