如何设置 C# MSTest 单元测试的工作目录?

发布于 2025-01-10 00:59:48 字数 1016 浏览 1 评论 0原文

我在 Linux (Debian Buster) 下使用 VS Code,目前使用 MSTest 框架编写一些单元测试。我的一些测试必须读取我存储在测试项目 NewAppTest 中的文件。 UnitTest1.cs需要读取some_data.json,目录结构:

NewAppTest
+ UnitTest1.cs
+ some_data.json

在UnitTest1.cs中,我使用此代码读取some_data.json:

[TestMethod]    
public void GetEmployee()
    {
      var data = File.ReadAllText("../../../some_data.json");
      Assert.IsNotNull(data);
    }

令我烦恼的是我需要在文件名前加上“../../../”前缀。当然必须有更好的方法来设置当前工作目录。我用谷歌搜索了一些,发现 这个这个,但我不明白 它。

我想创建一个像 .runsettings 这样的文件,在其中为项目中的所有测试指定当前工作目录。 我宁愿不必接触每个测试类。

适合我的用例的最小 .runsettings 示例会很好。

I'm using VS Code under Linux (Debian Buster) and currently write some unittests using the MSTest-framework. Some of my tests have to read files that I have stored in my Test-project NewAppTest. UnitTest1.cs needs to read some_data.json, directory structure:

NewAppTest
+ UnitTest1.cs
+ some_data.json

In UnitTest1.cs I use this code to read some_data.json:

[TestMethod]    
public void GetEmployee()
    {
      var data = File.ReadAllText("../../../some_data.json");
      Assert.IsNotNull(data);
    }

It bugs me that I need to prefix the filename with "../../../". Surely there must be a better way to set the current working dir. I googled some and found this and this, but I don't understand it.

I would like to create a file like said .runsettings where I specify the current working directory for all my tests in the project.
I would rather not have to touch every testclass.

A sample minimal .runsettings befitting my use case would be nice.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

他不在意 2025-01-17 00:59:48

在测试应用程序中包含文件的一个好方法是使用嵌入式资源。嵌入式资源与测试版本捆绑在一起,因此它们独立于其位置。
要嵌入文件,请编辑 .csproj 文件并添加以下项目组(作为 的子项):(

<ItemGroup>
  <EmbeddedResource Include="some_data.json" />
</ItemGroup>

如果 some_data.json< /code> 位于项目内的子文件夹中,路径为 subfolder/some_data.json)。

要读取嵌入资源,请使用 GetManifestResourceStream :

var assembly = typeof(UnitTest1).Assembly; //Get the assembly in which the resources are embedded
using Stream stream = assembly.GetManifestResourceStream("NewAppTest.some_data.json");

//Read the data from the stream as a string
using StreamReader reader = new(stream);
string data = reader.ReadToEnd();

A good way to include files in your test application is to use embedded resources. Embedded resources are bundled with the test build so they're independent of its location.
To embed a file, edit your .csproj file and add the following item group (as a child of <Project>):

<ItemGroup>
  <EmbeddedResource Include="some_data.json" />
</ItemGroup>

(If some_data.json is in a subfolder within the project, the path would be subfolder/some_data.json).

To read an embedded resource, use GetManifestResourceStream:

var assembly = typeof(UnitTest1).Assembly; //Get the assembly in which the resources are embedded
using Stream stream = assembly.GetManifestResourceStream("NewAppTest.some_data.json");

//Read the data from the stream as a string
using StreamReader reader = new(stream);
string data = reader.ReadToEnd();
清音悠歌 2025-01-17 00:59:48

谢谢,这很有效。对于所有正在阅读的人:
我还在测试项目中创建了一个名为“subfolder”的子文件夹,并将 some_data.json 和 more_data.json 放在那里:

subfolder\
+ some_data.json
+ more_data.json

在 csproj 中,我添加了它以包含所有文件:

<EmbeddedResource Include="subfolder/*.*" />

在 TestMethod 中,我用它来读取文件:

var assembly = typeof(UnitTest1).Assembly;
using Stream stream =  assembly.GetManifestResourceStream("NewAppTest.subfolder.more_data.json");

这样当您为测试添加新数据文件时,无需编辑 csproj。

Thank you, this worked well. For all who are reading along:
I also created a subfolder named "subfolder" in the Test-Project and put some_data.json and more_data.json in there:

subfolder\
+ some_data.json
+ more_data.json

In the csproj I added this to include all files:

<EmbeddedResource Include="subfolder/*.*" />

In the TestMethod I used this to read the files:

var assembly = typeof(UnitTest1).Assembly;
using Stream stream =  assembly.GetManifestResourceStream("NewAppTest.subfolder.more_data.json");

This way you don't need to edit your csproj when you add new data files for your tests.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文