首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NUnit。非静态TestCaseSource或ValueSource

NUnit。非静态TestCaseSource或ValueSource
EN

Stack Overflow用户
提问于 2022-05-23 15:29:06
回答 1查看 229关注 0票数 0

是否有任何从、非静态、TestCaseSource或ValueSource传递数据的选项?

我想把一些数据传递给注入dbContext的测试,这样我就不能使用静态源了。

以下代码引发错误:“在sourceName上指定的ValueSourceAttribute必须引用非空静态字段、属性或方法。”

代码语言:javascript
复制
[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);

    }
}

这也没用。

代码语言:javascript
复制
[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);

    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-05-23 16:10:11

不是的。

但是,您可以通过使用[OneTimeSetUp] attribute从数据库填充静态测试数据来解决这个问题。无论如何,这样做的效果会更好,因为您不需要每次测试都访问数据库。

代码语言:javascript
复制
[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);

    }
}

注意:在测试时使用真正的数据库通常是不可取的。这意味着您的测试将要求数据库存在于运行它们的环境中,而不是对运行它们的人进行“只工作”的测试。相反,最好是模拟通常从数据库中检索的数据,这样就没有额外的依赖项了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72351135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档