工作流程图如下

  后我们来看看我们的测试代码,
  我们把StubWebService和MockEmailService两个类的实例注入到产品代码中。(因为多态特性嘛)。
  通过控制StubWebService中的LogError方法,抛出一个异常。
  然后判断MockEmailService中的SendEmail方法有没有被调用. 被调用了说明发送了Email(我们不需要真的收到一封邮件,因为SendEmail功能是IEmailService实现的,)

 

[TestMethod]
public void TestMethod1()
{
StubWebService stubWebService = new StubWebService();
MockEmailService mockEmailSender = new MockEmailService();
LogAnalyzer log = new LogAnalyzer();
log.Emailservice = mockEmailSender;
log.WebService = stubWebService;
// Act
string tooShortFileName = "1.txt";
log.Analyze(tooShortFileName);
// Assert
Assert.AreEqual("to@test.com", mockEmailSender.To);
Assert.AreEqual("from@test.com", mockEmailSender.From);
Assert.AreEqual("WebSerive log error", mockEmailSender.Subject);
}

  Stub和Mock的相同处
  从上面的例子我们可以看出, Stub和Mock都是模拟外部依赖,以便我们能控制。
  Stub 和Mock 的区别
  Stub是完全模拟一个外部依赖, 而Mock用来判断测试通过还是失败