VS2008单元测试 - 断言方法退出

Sar*_*els 5 c# unit-testing exit visual-studio-2008

我正在尝试使用VS 2008的内置单元测试框架和我正在测试调用的方法编写C#单元测试Environment.Exit(0).当我在单元测试中调用此方法时,我的单元测试是Aborted.该方法确实应该调用Exit,我想要一种方法来测试它,并且还测试它使用的退出代码.我怎么能这样做?我查看了Microsoft.VisualStudio.TestTools.UnitTesting命名空间,但没有看到任何看起来相关的内容.

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

同时,这是我要测试的代码的要点:

static void myMethod()
{
    Environment.Exit(0);
}
Run Code Online (Sandbox Code Playgroud)

编辑: 这是我在测试方法中使用的解决方案,感谢RichardOD:

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);
Run Code Online (Sandbox Code Playgroud)

tva*_*son 5

您需要为Environment类创建一个包装器,然后在代码中使用包装器.对于单元测试,请注入包装器的模拟版本.以下示例使用RhinoMocks验证该方法是否使用expected参数调用包装器.

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()
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*dOD 4

这听起来是一个非常糟糕的主意。Environment.Exit(0) 显然会按照规定执行,这就是为什么你的单元测试会失败。

如果您确实想仍然测试这个,您可以通过启动一个单独的进程并检查返回代码 - 看看将其包装在Process.Start中。

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

也许你可以使用 Typemock Isolator 做一些事情 - 我相信这可以让你模拟静态方法