2012-09-12 93 views
18

我正在尝试使用Xunit设置我的测试。我有一个要求删除文件夹开始测试中的所有图像,然后每个方法都会进行一些图像大小调整并将其输出的副本保存到文件夹中。该文件夹只能清空一次,然后每个方法将自己的图像保存到文件夹中。如何在xUnit.net测试中只运行一次设置代码

当我使用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测试跑步者。

回答

25

按照xUnit discussion topic的指导,看起来您需要在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)2007-11 Microsoft Corporation版权所有(c) 。

xunit.dll:版本1.9.1.1600测试组件:Test.dll的

SomeFixture构造函数:这应该只运行一次

测试完成:2 SomeFixture 2

:处置SomeFixture

2总,0失败,跳过0,把0.686秒

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

6

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

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

一次性清理,实现对灯具的IDisposable.Dispose(它不是必需的,虽然)

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

11

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

相关问题