NUnit的奇怪行为,ExpectedException &收益回报
本文关键字:ExpectedException 收益 回报 NUnit | 更新日期: 2023-09-27 18:15:43
我在测试中有一个奇怪的行为,我想测试当null作为参数传入时抛出异常。当我运行测试时,我从NUnit得到:
System.ArgumentNullException was expected
-- Exception doesn't have a stack trace --
我的测试:
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void Should_not_retrieve_any_fields_when_file_is_null()
{
_creator.CreateFields(null);
}
我实现:public IEnumerable<ImportField> CreateFields(HttpPostedFileBase file)
{
if (file == null) throw new ArgumentNullException("file");
using (var reader = new StreamReader(file.InputStream))
{
var firstLine = reader.ReadLine();
var columns = firstLine.Split(new[] { ',' });
for (var i = 0; i < columns.Length; i++)
{
yield return new ImportField(columns[i], i);
}
}
}
是否有一个合乎逻辑的解释这种行为,我应该使我的实现不同?
您得到这种行为的原因是因为yield关键字。当使用yield时,编译器将为该方法生成一个包含yield的类。当调用该方法时,控制权将无条件地返回给调用者。在需要之前,方法中的任何内容都不会执行。
如果您将using语句提取到一个单独的方法中并返回结果,则测试将通过。或者您可以将结果存储到测试中的一个变量中,例如在它上面调用"ToList()"。
public IEnumerable<ImportField> CreateFields(HttpPostedFileBase file)
{
if (file == null) throw new ArgumentNullException("file");
return ExtractFromFile(file);
}
private IEnumerable<ImportField> ExtractFromFile(HttpPostedFileBase file)
{
using (var reader = new StreamReader(file.InputStream))
{
var firstLine = reader.ReadLine();
var columns = firstLine.Split(new[] { ',' });
for (var i = 0; i < columns.Length; i++)
{
yield return new ImportField(columns[i], i);
}
}
}