VS2008单元测试-断言方法退出
-
13-09-2019 - |
题
我正在尝试使用 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
}