문제

VS 2008의 내장 단위 테스트 프레임 워크 및 테스트를 테스트하는 방법으로 C# 단위 테스트를 작성하려고합니다. Environment.Exit(0). 단위 테스트 에서이 방법을 호출하면 단위 테스트가 중단됩니다. 이 방법은 실제로 호출해야합니다 Exit, 그리고 나는 그것을 테스트하고 그것이 사용하는 출구 코드를 테스트하는 방법을 원합니다. 어떻게 할 수 있습니까? 나는 보았다 Microsoft.visualstudio.testTools.Unittesting 네임 스페이스 그러나 관련성이없는 것을 보지 못했습니다.

[TestMethod]
[DeploymentItem("myprog.exe")]
public void MyProgTest()
{
    // Want to ensure this Exit's with code 0:
    MyProg_Accessor.myMethod();
}

한편, 테스트하고 싶은 코드의 요점은 다음과 같습니다.

static void myMethod()
{
    Environment.Exit(0);
}

편집하다: 다음은 테스트 방법에 사용한 솔루션입니다. 리차드로드:

Process proc;

try
{
    proc = Process.Start(path, myArgs);
}
catch (System.ComponentModel.Win32Exception ex)
{
    proc = null;
    Assert.Fail(ex.Message);
}

Assert.IsNotNull(proc);
proc.WaitForExit(10000);
Assert.IsTrue(proc.HasExited);
Assert.AreEqual(code, proc.ExitCode);
도움이 되었습니까?

해결책

이것은 엄청나게 나쁜 생각처럼 들립니다. Environment.exit (0)는 분명히 규정 된대로 수행하므로 단위 테스트가 깨지는 이유.

실제로 테스트하고 싶다면 별도의 프로세스를 시작하고 리턴 코드를 확인하여 할 수 있습니다. Process.Start.

또 다른 옵션은이 코드를 고려하고 테스트 스파이, 또는 모의 개체를 사용하여 올바른 동작을 확인합니다.

아마도 당신은 타입 콕 Isolator로 무언가를 할 수 있습니다- 나는 이것이 당신을 허용한다고 믿습니다. 정적 방법을 조롱합니다.

다른 팁

환경 클래스 용 래퍼를 만들고 코드에서 래퍼를 사용해야합니다. 장치 테스트의 경우 모의 버전의 래퍼를 주입하십시오. 다음 예제는 Rhinomocks를 사용하여 메소드가 예상되는 인수로 래퍼를 호출하는지 확인합니다.

public class EnvironmentWrapper
{
    public virtual void Exit( int code )
    {
        Environment.Exit( code );
    }
}


public class MyClass
{
    private EnvironmentWrapper Environment { get; set; }

    public MyClass() : this( null ) { }

    public MyClass( EnvironmentWrapper wrapper )
    {
        this.Environment = wrapper ?? new EnvironmentWrapper();
    }

    public void MyMethod( int code )
    {
        this.Environment.Exit( code )
    }
}


[TestMethod]
public void MyMethodTest()
{
     var mockWrapper = MockRepository.GenerateMock<EnvironmentWrapper>();

     int expectedCode = 5;

     mockWrapper.Expect( m => m.Exit( expectedCode ) );

     var myClass = new MyClass( mockWrapper );

     myclass.MyMethod( expectedCode );

     mockWrapper.VerifyAllExpectations()
}

당신은 이것을 테스트 할 수 없습니다 - Environment.Exit 응용 프로그램을 완전히 죽입니다. 이는이 코드를 사용하는 모든 appDomain이 생산 응용 프로그램이든 단위 테스트 프레임 워크이든 완전히 내릴 것임을 의미합니다.

여기서 유일한 옵션은 Fakie 출구 방법으로 환경 클래스를 조롱하는 것입니다.

exit () 메소드가 종료되지 않는 가짜 환경을 전달하기 위해 방법에 인수를 추가 할 수 있습니다.

응용 프로그램에서 호출 된 방법에서 추출한이 매개 변수화 된 방법과 추출 된 기능을 단위 테스트 할 수 있습니다. 그렇게하면 앱을 수정할 필요가 없습니다.

내 마음에 오는 유일한 것은 다음과 같습니다.

static void myMethod()
{
    DoEnvironmentExit(0);
}

static void DoEnvironentExit(int code)
{
    #if defined TEST_SOLUTION
      SomeMockingFunction(code);
    #else
      Environment.Exit(code);
    #endif
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top