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);
        }
    }
}

是否有一个合乎逻辑的解释这种行为,我应该使我的实现不同?

NUnit的奇怪行为,ExpectedException &收益回报

您得到这种行为的原因是因为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);
            }
        }
    }
相关文章:
  • 没有找到相关文章