27

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

当我使用时,在每次测试之前仍然会调用IUseFixture<T>该函数,所以我最终在文件夹中只有一张图像。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
    }
}

如果我把它放在ClearVisualTestResultFolder构造函数中,它也会为每个测试方法调用一次。我只需要在所有测试方法执行之前运行一次,我该如何实现?

如果重要的话,我会使用 ReSharper 测试运行器。

4

3 回答 3

30

按照此xUnit 讨论主题中的指导,您似乎需要在 Fixture 上实现构造函数并实现 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");
        }
    }
}

从控制台运行程序运行此程序时,您将看到以下输出:

D:\xUnit>xunit.console.clr4.exe test.dll /html foo.htm xUnit.net 控制台测试运行程序(64 位 .NET 4.0.30319.17929)版权所有 (C) 2007-11 Microsoft Corporation。

xunit.dll:版本 1.9.1.1600 测试程序集:test.dll

SomeFixture ctor:这只应该运行一次

测试完成:2 个,共 2 个

SomeFixture:处理 SomeFixture

共 2 个,0 个失败,0 个跳过,耗时 0.686 秒

然后,当你破解打开测试输出文件 foo.htm 时,你会看到另一个测试输出。

于 2012-09-12T02:13:31.070 回答
21

xUnit.net v1.x中的旧IUseFixture<T>接口已被两个新接口取代:和. 此外,将夹具值注入测试的机制已从属性设置器更改为构造器参数。类夹具创建一次并在同一类中的所有测试之间共享(很像旧的 IUseFixture)。集合夹具的工作方式相同,除了单个实例在同一测试集合中的所有测试之间共享。IClassFixture<T>ICollectionFixture<T>

于 2015-08-24T06:02:19.920 回答
6

注意这仅适用于 xUnit.net v1 - 请参阅接受的答案,除非这是您的情况


IUseFixture<T>.SetFixture每次测试都会调用一次。夹具本身只创建一次。

换句话说,您不应该在 SetFixture 方法中做任何事情,而是应该在 Fixture 构造函数中触发它。

对于一次性清理,IDisposable.Dispose在 Fixture 上实现一个(虽然它不是必需的)

请注意,在测试之间(甚至可能)共享状态是一个坏主意。最好用一个TemporaryDirectoryFixture 这样的。

于 2012-09-12T08:07:10.377 回答