我正在尝试使用VS 2008的内置单元测试框架和我正在测试调用Environment.Exit(0)
的方法编写C#单元测试。当我在单元测试中调用此方法时,我的单元测试是Aborted。该方法确实应该调用Exit
,我想要一种方法来测试它,并且还要测试它使用的退出代码。我怎么能这样做?我看了Microsoft.VisualStudio.TestTools.UnitTesting Namespace,但没有看到任何看起来相关的东西。
[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);
}
修改:这是我在测试方法中使用的解决方案,感谢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);
答案 0 :(得分:5)
您需要为Environment类创建一个包装器,然后在代码中使用包装器。对于单元测试,请注入包装器的模拟版本。以下示例使用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()
}
答案 1 :(得分:4)
这听起来像是一个非常糟糕的主意。 Environment.Exit(0),显然会按照规定进行,因此你的单元测试会破坏。
如果你真的想要测试这个,你可以通过启动一个单独的过程并检查返回代码 - 看一下将它包装在Process.Start中。
我想另一种选择是将此代码分解并注入test spy,或使用模拟对象来验证正确的行为。
也许你可以用Typemock Isolator做点什么 - 我相信这会让你mock static methods。
答案 2 :(得分:3)
您将无法对此进行测试 - Environment.Exit
会完全杀死该应用程序。这意味着任何使用此代码的AppDomain都将被完全卸载,无论是您的生产应用程序还是单元测试框架。
答案 3 :(得分:2)
这里唯一的选择是使用fakie Exit方法模拟Environment类。
答案 4 :(得分:0)
您可以在方法中添加一个参数,以便将其传递给exit()方法不会退出的虚假环境。
您可以从应用程序调用的方法中提取此参数化方法,并对提取的函数进行单元测试。这样,您就不必修改您的应用。
答案 5 :(得分:0)
我唯一想到的是:
static void myMethod()
{
DoEnvironmentExit(0);
}
static void DoEnvironentExit(int code)
{
#if defined TEST_SOLUTION
SomeMockingFunction(code);
#else
Environment.Exit(code);
#endif
}