C# 如何在xUnit.net测试中只运行一次安装程序代码
我正在尝试使用Xunit设置测试。我需要在测试开始时删除文件夹中的所有图像,然后每个方法都会调整图像大小,并将其输出的副本保存到文件夹中。该文件夹只应清空一次,然后每个方法将自己的图像保存到该文件夹中C# 如何在xUnit.net测试中只运行一次安装程序代码,c#,asp.net,xunit,xunit.net,C#,Asp.net,Xunit,Xunit.net,我正在尝试使用Xunit设置测试。我需要在测试开始时删除文件夹中的所有图像,然后每个方法都会调整图像大小,并将其输出的副本保存到文件夹中。该文件夹只应清空一次,然后每个方法将自己的图像保存到该文件夹中 public class Fixture { public void Setup() { ImageHelperTest.ClearVisualTestResultFolder(); } } public class ImageHelperTest : I
public class Fixture
{
public void Setup()
{
ImageHelperTest.ClearVisualTestResultFolder();
}
}
public class ImageHelperTest : IUseFixture<EngDev.Test.Fixture>
{
public void SetFixture(EngDev.Test.Fixture data)
{
data.Setup();
}
public static void ClearVisualTestResultFolder()
{
// Logic to clear folder
}
}
当我使用IUseFixture
时,每次测试前仍会调用ClearVisualTestResultFolder
函数,因此文件夹中只有一个图像
public class Fixture
{
public void Setup()
{
ImageHelperTest.ClearVisualTestResultFolder();
}
}
public class ImageHelperTest : IUseFixture<EngDev.Test.Fixture>
{
public void SetFixture(EngDev.Test.Fixture data)
{
data.Setup();
}
public static void ClearVisualTestResultFolder()
{
// Logic to clear folder
}
}
公共类设备
{
公共作废设置()
{
ImageHelperTest.ClearVisualTestResultFolder();
}
}
公共类ImageHelperTest:IUseFixture
{
公共无效设置夹具(EngDev.Test.Fixture数据)
{
data.Setup();
}
公共静态无效ClearVisualTestResultFolder()
{
//清除文件夹的逻辑
}
}
如果我将ClearVisualTestResultFolder
放在构造函数中,那么每个测试方法也会调用它一次。我需要在执行所有测试方法之前只运行一次,如何实现这一点
如果有必要,我将使用ReSharper测试运行程序。按照本文中的指导,看起来您需要在夹具上实现一个构造函数,还需要实现IDisposable。以下是一个完整的示例,其行为符合您的要求:
using System;
using System.Diagnostics;
using Xunit;
using Xunit.Sdk;
namespace xUnitSample
{
public class SomeFixture : IDisposable
{
public SomeFixture()
{
Console.WriteLine("SomeFixture ctor: This should only be run once");
}
public void SomeMethod()
{
Console.WriteLine("SomeFixture::SomeMethod()");
}
public void Dispose()
{
Console.WriteLine("SomeFixture: Disposing SomeFixture");
}
}
public class TestSample : IUseFixture<SomeFixture>, IDisposable
{
public void SetFixture(SomeFixture data)
{
Console.WriteLine("TestSample::SetFixture(): Calling SomeMethod");
data.SomeMethod();
}
public TestSample()
{
Console.WriteLine("This should be run once before every test " + DateTime.Now.Ticks);
}
[Fact]
public void Test1()
{
Console.WriteLine("This is test one.");
}
[Fact]
public void Test2()
{
Console.WriteLine("This is test two.");
}
public void Dispose()
{
Console.WriteLine("Disposing");
}
}
}
使用系统;
使用系统诊断;
使用Xunit;
使用Xunit.Sdk;
名称空间xUnitSample
{
公共类:IDisposable
{
公共设施(
{
WriteLine(“SomeFixture:This应该只运行一次”);
}
公共方法()
{
WriteLine(“SomeFixture::SomeMethod()”;
}
公共空间处置()
{
Console.WriteLine(“SomeFixture:Disposing SomeFixture”);
}
}
公共类测试示例:IUseFixture,IDisposable
{
公共void SetFixture(某些fixture数据)
{
WriteLine(“TestSample::SetFixture():调用SomeMethod”);
data.SomeMethod();
}
公共测试样本()
{
WriteLine(“这应该在每次测试之前运行一次”+DateTime.Now.Ticks);
}
[事实]
公共void Test1()
{
WriteLine(“这是测试一”);
}
[事实]
公共无效测试2()
{
WriteLine(“这是测试二。”);
}
公共空间处置()
{
控制台。写入线(“处置”);
}
}
}
从console runner运行时,您将看到以下输出:
D:\xUnit>xUnit.console.clr4.exe test.dll/html foo.htm xUnit.net
控制台测试运行程序(64位.NET 4.0.30319.17929)版权所有(C)
2007-11微软公司
xunit.dll:版本1.9.1.1600测试程序集:Test.dll
SomeFixture:这应该只运行一次
测试完成:2个,共2个
SomeFixture:处理SomeFixture
总共2次,0次失败,0次跳过,耗时0.686秒
然后,当您打开测试输出文件foo.htm时,您将看到其他测试输出。IUseFixture.SetFixture
将为每个测试调用一次。设备本身只创建一次
换句话说,您不应该在SetFixture方法中执行任何操作,而是应该在Fixture构造函数中触发它
对于一次性清理,在夹具上实现一个IDisposable.Dispose
(虽然不是必需的)
请注意,在测试之间(甚至可能)共享状态是个坏主意。最好使用临时目录夹具
xUnit.net v1.x中旧的IUseFixture
接口已被替换
通过两个新接口:IClassFixture
和ICollectionFixture
。在里面
此外,将fixture值注入测试的机制
已从属性设置器更改为构造函数参数。等级
夹具创建一次,并在同一测试中的所有测试中共享
类(非常像旧的IUseFixture)。收集装置工作正常
相同的方式,除了单个实例在所有测试中共享
在同一测试集合中
那次跑步叫什么名字?TestSample中的构造函数未调用SetFixture