2012-09-12 4 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 
    } 
} 

, 그것은 또한 모든 시험 방법에 대해 한 번 호출되고. 모든 테스트 메서드가 실행되기 전에이 작업이 한 번 실행되어야합니다. 어떻게이 작업을 수행 할 수 있습니까?

중요한 경우 ReSharper 테스트 러너를 사용합니다.

답변

25

xUnit discussion topic의 지침에 따라 Fixture에 생성자를 구현하고 IDisposable을 구현해야하는 것처럼 보입니다.

D : \ xUnit의> xunit.console.clr4 콘솔 주자에서이 프로그램을 실행할 때

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"); 
     } 
    } 
} 

하면, 다음과 같은 출력을 볼 수 있습니다 : 여기 당신이 원하는 방식으로 작동 완전한 샘플입니다 .exe test.dll/html foo.htm xUnit.net 콘솔 테스트 러너 (64 비트 .NET 4.0.30319.17929) Copyright (C) 2007-11 Microsoft Corporation.

xunit.dll : 버전 1.9.1.1600 테스트 어셈블리 : Test.dll에

SomeFixture의 ctor에이은

테스트 완료하면 실행해야합니다 : 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>. 에 추가로 Fixture 값을 테스트 에 주입하는 메커니즘이 속성 setter에서 생성자 인수로 변경되었습니다. Class 픽스쳐는 한 번 생성되고 동일한 클래스 (모든 이전 IUseFixture와 유사)에서 모든 테스트간에 공유됩니다. 컬렉션 픽스처는 같은 테스트 컬렉션에서 모든 테스트 사이에서 단일 인스턴스가 공유된다는 점을 제외하고는 동일한 방식으로 을 작동합니다.