Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在xUnit.net测试中只运行一次安装程序代码_C#_Asp.net_Xunit_Xunit.net - Fatal编程技术网

C# 如何在xUnit.net测试中只运行一次安装程序代码

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

我正在尝试使用Xunit设置测试。我需要在测试开始时删除文件夹中的所有图像,然后每个方法都会调整图像大小,并将其输出的副本保存到文件夹中。该文件夹只应清空一次,然后每个方法将自己的图像保存到该文件夹中

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