是否有任何从、非静态、TestCaseSource或ValueSource传递数据的选项?
我想把一些数据传递给注入dbContext的测试,这样我就不能使用静态源了。
以下代码引发错误:“在sourceName上指定的ValueSourceAttribute必须引用非空静态字段、属性或方法。”
[Parallelizable(ParallelScope.All)]
[FixtureLifeCycle(LifeCycle.InstancePerTestCase)]
public class MyTests
{
public MyTests()
{
}
public IEnumerable ValueSource
{
get
{
yield return new TestCaseData("test1");
yield return new TestCaseData("test2");
// yield some data from DbContext
}
}
[Test]
public void MyTest([ValueSource(nameof(ValueSource))] string name)
{
Console.WriteLine(name);
}
}这也没用。
[Parallelizable(ParallelScope.All)]
public class MyTests
{
private static List<TestCaseData> additional = new List<TestCaseData>();
[OneTimeSetUp]
public void OneTimeSetUp()
{
additional.Add(new TestCaseData("test3"));
}
public static IEnumerable<TestCaseData> TestCases
{
get
{
yield return new TestCaseData("test1");
yield return new TestCaseData("test2");
foreach (var testCase in additional)
yield return testCase;
}
}
[Test, TestCaseSource(nameof(TestCases))]
public void MyTest(string name)
{
Console.WriteLine(name);
}
}发布于 2022-05-23 16:10:11
不是的。
但是,您可以通过使用[OneTimeSetUp] attribute从数据库填充静态测试数据来解决这个问题。无论如何,这样做的效果会更好,因为您不需要每次测试都访问数据库。
[Parallelizable(ParallelScope.All)]
public class MyTests
{
private static List<TestCaseData> databaseTests = new List<TestCaseData>();
[OneTimeSetUp]
public void OneTimeSetUp()
{
var dbData = // Run query...
foreach (var item in dbData)
{
databaseTests.Add(TestCaseData(item));
}
}
public static IEnumerable ValueSource
{
get
{
yield return new TestCaseData("test1");
yield return new TestCaseData("test2");
// yield some data from DbContext
foreach (var testCase in databaseTests)
yield return testCase;
}
}
[Test]
public void MyTest([ValueSource(nameof(ValueSource))] string name)
{
Console.WriteLine(name);
}
}注意:在测试时使用真正的数据库通常是不可取的。这意味着您的测试将要求数据库存在于运行它们的环境中,而不是对运行它们的人进行“只工作”的测试。相反,最好是模拟通常从数据库中检索的数据,这样就没有额外的依赖项了。
https://stackoverflow.com/questions/72351135
复制相似问题