You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NUnit报错‘Test case source cannot be found’问题求助

NUnit报错“test case source cannot be found”的解决方法

核心问题

你当前使用[TestCaseSource(nameof(InputFilesGenerator))]的写法有误:nameof(InputFilesGenerator)指向的是外部类名称,但NUnit默认会在当前测试类(IntegrationTestA)内部查找同名的成员(方法/字段/属性),找不到就会触发该报错。

同时代码里存在两处细节问题:

  1. yield return file.Path.;有多余的点,属于语法错误
  2. 测试用例返回值需要是object[]类型(对应测试方法的参数列表),直接返回字符串无法被NUnit正确识别

修复方案(二选一)

方案1:将数据源改为测试类内部的静态方法

把生成测试用例的逻辑移到测试类内部,作为静态方法返回IEnumerable<object[]>:

using Microsoft.Extensions.FileSystemGlobbing;
using Microsoft.Extensions.FileSystemGlobbing.Abstractions;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.IO;

namespace IntegrationTests
{
    [TestFixture]
    public class IntegrationTestA
    {
        [TestCaseSource(nameof(GetInputFiles))]
        public void TestA(string inputFile)
        {
            Main(inputFile);
        }

        // 测试类内部的静态数据源方法
        private static IEnumerable<object[]> GetInputFiles()
        {
            var matcher = new Matcher();
            matcher.AddInclude("**/*.lcd");

            string workingDirectory = Environment.CurrentDirectory;
            var rootDirectory = Directory.GetParent(workingDirectory).Parent.Parent.Parent.Parent;
            var searchDirectories = rootDirectory.GetDirectories("samples");

            if (searchDirectories.Length != 1) { throw new Exception("Unexpected number of samples directories"); }
            var samplesDirectory = searchDirectories[0];

            var patternMatch = matcher.Execute(new DirectoryInfoWrapper(samplesDirectory));
            foreach (var file in patternMatch.Files)
            {
                // 每个测试用例用object[]包裹,对应测试方法的参数
                yield return new object[] { file.Path };
            }

            // 测试固定值的写法(可替换上面的逻辑)
            // for(int i =0; i < 10; i++)
            // {
            //     yield return new object[] { i.ToString() };
            // }
        }
    }
}

方案2:保留外部数据源类,修改TestCaseSource参数

将TestCaseSource的参数改为数据源类的Type,同时修复语法错误和返回值格式:

using Microsoft.Extensions.FileSystemGlobbing;
using Microsoft.Extensions.FileSystemGlobbing.Abstractions;
using NUnit.Framework;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;

namespace IntegrationTests
{
    [TestFixture]
    public class IntegrationTestA
    {
        // 传入数据源类的Type而非类名字符串
        [TestCaseSource(typeof(InputFilesGenerator))]
        public void TestA(string inputFile)
        {
            Main(inputFile);
        }
    }

    // 实现泛型IEnumerable<object[]>,代码更清晰
    public class InputFilesGenerator : IEnumerable<object[]>
    {
        public IEnumerator<object[]> GetEnumerator()
        {
            var matcher = new Matcher();
            matcher.AddInclude("**/*.lcd");

            string workingDirectory = Environment.CurrentDirectory;
            var rootDirectory = Directory.GetParent(workingDirectory).Parent.Parent.Parent.Parent;
            var searchDirectories = rootDirectory.GetDirectories("samples");

            if (searchDirectories.Length != 1) { throw new Exception("Unexpected number of samples directories"); }
            var samplesDirectory = searchDirectories[0];

            var patternMatch = matcher.Execute(new DirectoryInfoWrapper(samplesDirectory));
            foreach (var file in patternMatch.Files)
            {
                // 修复语法错误,返回正确的object[]格式
                yield return new object[] { file.Path };
            }

            // 测试固定值的写法(可替换上面的逻辑)
            // for(int i =0; i < 10; i++)
            // {
            //     yield return new object[] { i.ToString() };
            // }
        }

        // 实现非泛型IEnumerable的接口方法
        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }
}

内容的提问来源于stack exchange,提问作者user20660706

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:02:56