NUnit报错‘Test case source cannot be found’问题求助
NUnit报错“test case source cannot be found”的解决方法
核心问题
你当前使用[TestCaseSource(nameof(InputFilesGenerator))]的写法有误:nameof(InputFilesGenerator)指向的是外部类名称,但NUnit默认会在当前测试类(IntegrationTestA)内部查找同名的成员(方法/字段/属性),找不到就会触发该报错。
同时代码里存在两处细节问题:
yield return file.Path.;有多余的点,属于语法错误- 测试用例返回值需要是
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
相关产品推荐
相关产品推荐

