Mock nó ra ở một mức độ cao hơn thế. Tạo một lớp proxy xung quanh Process.Start()
, giả mạo trong kiểm tra và kiểm tra đầu vào.
public interface IProcessProxy
{
ProcessInfo Start(string application, string[] arguments);
}
public class ProcessProxy : IProcessProxy
{
public ProcessInfo Start(string application, string[] arguments)
{
return Process.Start(application, arguments);
}
}
// You could use a mocking framework for this, but for the purposes
// of this example ...
public class FakeProcessProxy : IProcessProxy
{
private string _expectedApplication;
private string[] _expectedArguments;
private ProcessInfo response;
public FakeProxy(string expectedApplication, string[] expectedArguments, ProcessInfo response)
{
_expectedApplication = expectedApplication;
_expectedArguments = expectedArguments;
}
public ProcessInfo Start(string application, string[] arguments)
{
// compare input to expectations and throw exception if not matching
return _response;
}
}
// You can also use an IoC framework to inject your IProcessProxy, but I won't.
public class ClassUnderTest
{
public ClassUnderTest(IProcessProxy proxy)
{
_proxy = proxy;
}
public ClassUnderTest() : this(new ProcessProxy())
{
}
public void MethodUnderTest()
{
// Do stuff
ProcessInfo process = _proxy.Start(@"C:\Program Files\App\App.exe", new[] { "arg1", "arg2" });
process.WaitForExit();
if (process.ExitCode == 0)
{
// Act on success
}
else
{
// Act on failure
}
}
}
Bất cứ nơi nào bạn cần sử dụng ClassUnderTest trong mã ứng dụng, hãy sử dụng hàm tạo mặc định. Trong các thử nghiệm của bạn, hãy chuyển FakeProcessProxy cho nhà xây dựng khác, sử dụng các tham số Proxy Start dự kiến của bạn và kết quả kiểm tra của bạn trong hàm tạo của fake.