【发布时间】:2017-03-30 15:31:48
【问题描述】:
在我正在测试接收更复杂对象的方法的场景中,我通常使用类似的东西来针对许多测试用例测试该方法:
[TestFixture()]
public class DataTransmitterFactoryTests
{
[Test, TestCaseSource(typeof(DataTransmitterFactoryTestCases), "CreateDataTransmitterFactoryTestCases")]
public void CreateTransmitterForStateTest(bool isException, Type type, IDataConfigurationData config)
{
var vtf = new DataTransmitterFactory();
if (isException)
{
Assert.That(() => vtf.CreateTransmitterForState(config), Throws.TypeOf(type));
}
else
{
var xmitter = vtf.CreateTransmitterForState(config);
Assert.IsInstanceOf(type, xmitter);
}
}
}
我使用 IEnumerable 将测试用例输入到我的测试中:
public class DataTransmitterFactoryTestCases
{
public static IEnumerable CreateDataTransmitterFactoryTestCases
{
get
{
yield return new TestCaseData(false, typeof(DataFileTransmitter),
FuncMocks.DataConfigurationDataMock(x =>
{
x.DataState.Returns(DataState.PA);
x.TransmissionType.Returns(DataTransmissionType.File);
return x;
})).SetName("CreateDataTransmitterFactoryTest - PA - FileTransmitter");
yield return new TestCaseData(false, typeof(DataWebServicePostTransmitter),
FuncMocks.DataConfigurationDataMock(x =>
{
x.DataState.Returns(DataState.PA);
x.RunMode.Returns(DataRunMode.Production);
x.TransmissionType.Returns(DataTransmissionType.WebServicePost);
return x;
})).SetName("CreateDataTransmitterFactoryTest - PA - WebServicePost");
yield return new TestCaseData(true, typeof(NotImplementedException),
FuncMocks.DataConfigurationDataMock(x =>
{
x.DataState.Returns(DataState.PA);
x.TransmissionType.Returns(DataTransmissionType.RestWebService);
return x;
})).SetName("CreateDataTransmitterFactoryTest - PA - RestWebService");
yield return new TestCaseData(true, typeof(NotImplementedException),
FuncMocks.DataConfigurationDataMock(x =>
{
x.DataState.Returns(DataState.PA);
x.TransmissionType.Returns(DataTransmissionType.Unknown);
return x;
})).SetName("CreateDataTransmitterFactoryTest - PA - Unknown");
}
}
}
但是,我经常希望包含一个引发异常的测试用例。在 nUnit 2 中,您似乎可以将 .Throws(typeof(ArguementException) 添加为扩展方法,TestCase 会查找它。
在这种情况下,我正在测试以确保生成的工厂对象在从工厂获取错误数据时抛出异常。结果对象只有一个内部构造函数。
现在,nUnit 3 似乎希望您使用“Assert.That(Func...”来测试异常。在这种情况下,我必须有一个单独的异常测试数据源。
我的技巧是将bool isException, Type type.. 传递到方法中并使用if 语句来决定我使用的是Assert.That() 还是Assert.IsInstance()。这看起来很 hacky,但我还没有找到更好的方法。
有没有更好的方法在不使用上述技巧的情况下将混合测试数据(工作/引发异常)输入测试?比如:
public static IEnumerable TestCases
{
get
{
yield return new TestCaseData(xyz).Returns(5);
yield return new TestCaseData(xyz).Throws(typeof(ArgumentException);
}
}
【问题讨论】:
标签: c# testing nunit nunit-3.0