Visual Studio单元测试读取同目录JSON文件提示找不到文件如何解决
解决方案
问题1:设置「始终复制」仍找不到文件
你存放在Models文件夹下的JSON文件设置始终复制后,会在输出目录保留原有的文件夹层级,不会直接放到输出根目录,所以你直接在输出根目录查找文件肯定会报错。
- 第一步:先手动打开输出目录
C:\Path\ServerTests\bin\Debug\net5.0,确认是否存在Models子文件夹,且子文件夹内有JsonObjectAsArray.json文件。 - 第二步:调整读取路径,拼接对应文件夹层级:
var baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var jsonPath = Path.Combine(baseDir, "Models", "JsonObjectAsArray.json"); var jsonContent = File.ReadAllText(jsonPath);
- 如果输出目录不存在对应文件,直接打开
ServerTests.csproj项目文件,确认存在以下配置,没有就手动添加后重新生成项目:
<ItemGroup> <None Update="Models\JsonObjectAsArray.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup>
问题2:嵌入资源读取返回null
你之前的代码拼接的资源名错误,嵌入资源的命名规则为「项目默认命名空间.文件夹路径.文件名」,文件夹层级用.连接,你放在Models文件夹下的文件,资源名需要加上.Models前缀,你之前的代码缺失了这部分所以找不到资源。
正确的读取代码如下:
TypeInfo typeInfo = typeof(JsonConverterTests).GetTypeInfo(); // 补充Models文件夹对应的前缀 string resourceName = $"{typeInfo.Namespace}.Models.JsonObjectAsArray.json"; using Stream stream = typeInfo.Assembly.GetManifestResourceStream(resourceName); using StreamReader reader = new StreamReader(stream); string json = reader.ReadToEnd();
如果依然找不到,可以先输出程序集内所有嵌入资源名称,确认正确的资源名后再使用:
var allResourceNames = typeInfo.Assembly.GetManifestResourceNames(); // 打断点查看allResourceNames数组,找到JSON文件对应的实际资源名直接使用即可
内容的提问来源于stack exchange,提问作者Ryan Kanno
相关产品推荐
相关产品推荐

