【发布时间】:2014-03-12 01:50:29
【问题描述】:
我正在使用 Nunit 为 C# 项目编写单元测试。
我正在尝试使用 TestCaseSource 属性使用不同的数据多次运行单个测试。
我在其他地方执行此操作没有任何问题,但现在我发现我第一次运行测试时,代码通过了。下一次,就不行了。使用一些Console.WriteLine 语句,我可以看到测试数据每次都不一样。
用于生成数据的方法是测试类内部的,不是静态的,它会为每个测试从头开始生成所有必需的依赖项。
--
我有一个假类,它包含一个值队列,以便在调用给定函数时返回。为每个测试创建一个新类。
但是,如果第一次运行测试,它会耗尽队列,下次运行时,找不到数据。这肯定应该每次都重新生成吗?
--
就好像每次运行测试时 Nunit 都没有调用 TestCaseSource 属性指定的方法——仅在项目首次加载时。
这是预期的吗?有解决办法吗?
编辑:
好的,下面是一个非常基本的示例:
[TestFixture]
public class Tests
{
public interface IEntry
{
object Read();
}
[TestCaseSource("TestData")]
public void Test(Mock<IEntry> entry)
{
object o = entry.Object.Read();
object o2 = entry.Object.Read();
}
public System.Collections.IEnumerable TestData()
{
var entry = new Mock<IEntry>();
int call = 0;
entry.Setup(x => x.Read()).Returns(() =>
{
Console.WriteLine(call);
return null;
}).Callback(() =>
{
call++;
});
yield return new TestCaseData(entry);
}
}
如果您在 Nunit 中查看测试输出,它应该始终显示 0,然后显示 1。在这种情况下,每次运行测试时,它都会递增。 IE。第二轮:2和3,第三轮:4和5等
如果您将TestData 代码移动到Test,则每次都会返回正确的值。
【问题讨论】:
-
你能告诉我们你的代码吗?
-
我添加了一个使用 Moq 的简单示例,它演示了相同的问题。