我正在尝试使用 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),将明显做的规定,因此,为什么你的单元testings被打破。

如果你真的想通过启动一个单独的进程,并检查返回代码 - 在的的Process.Start

我想另一个选项出因式分解此代码,并注入测试间谍或使用模拟对象,以验证正确的行为。

也许你可以做一些与Typemock 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 完全杀死的应用。这意味着使用该代码的任何应用程序域将被完全卸载,无论是生产应用程序或单元测试框架。

您唯一的选择这里将与一个飞骑退出方法来模拟环境类。

您可以将参数添加到您的方法传递给它一个假的环境下,出口()将不会退出方法。

可以从从应用程序调用的方法提取此参数化方法,和单元测试所提取的功能。这样,您就不必修改您的应用程序。

这是我想到的唯一的事情是沿东西:

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