单元测试和集成测试业务应用程序(5)

发表于:2016-06-01来源:不详作者:Omar Al Zabir点击数: 标签:单元测试
现在添加真正的代码: public Page Insert(Action populate) { var newPage = _database.Insert( DropthingsDataContext.SubsystemEnum.Page, populate); RemoveUserPagesCollection(newPage.UserId); ret

  现在添加真正的代码:

  public Page Insert(Action populate)

  {

  var newPage = _database.Insert(

  DropthingsDataContext.SubsystemEnum.Page, populate);

  RemoveUserPagesCollection(newPage.UserId);

  return newPage.Detach();

  }

  现在,当单元测试是对的PageRepository ,它通过新的测试,与以往的测试一起:

  使用BDD进行集成测试测试驱动开发

  如果我们想为集成测试做TDD?我们如何先写测试代码,然后写它与其他组件集成业务层的代码? 我们如何为Web层做TDD?方法是一样的,首先你编写测试代码,给出正确的输入,并期望从中活得输出,然而,集成测试不应该只调用单独一个业务操作,以确保它能正常工作。集成测试还应该确保执行其它操作时出现正确的行为。例如,在测试FirstVisitHomePage 时,期望的是,第一次访问之后,用户具有创建的正确页面。测试代码通过检查返回的对象模型验证这一点,但实际情况是,在第一次访问后,根据用户的返回,他们应该看到相同的部件,再次确认第一和复诊返回相同的数据。

  测试如下:

  public void Revisit_should_load_the_pages_and_widgets_exactly_the_same()

  {

  MembershipHelper.UsingNewAnonUser((profile) =>

  {

  using (var facade = new Facade(new AppContext(string.Empty, profile.UserName)))

  {

  UserSetup userVisitModel = null;

  UserSetup userRevisitModel = null;

  "Given an anonymous user who visited first".Context(() =>

  {

  userVisitModel = facade.FirstVisitHomePage(profile.UserName, ...);

  });

  "when the same user visits again".Do(() =>

  {

  userRevisitModel = facade.RepeatVisitHomePage(profile.UserName, ...);

  });

  "it should load the exact same pages, column and

  widgets as the first visit produced".Assert(() =>

  {

  userVisitModel.UserPages.Each(firstVisitPage =>

  {

  Assert.True(userRevisitModel.UserPages.Exists(page =>

  page.ID == firstVisitPage.ID));

  var revisitPage = userRevisitModel.UserPages.First(page =>

  page.ID == firstVisitPage.ID);

  var revisitPageColumns = facade.GetColumnsInPage(revisitPage.ID);

  facade.GetColumnsInPage(firstVisitPage.ID).Each(firstVisitColumn =>

  {

  var revisitColumn = revisitPageColumns.First(column =>

  column.ID == firstVisitColumn.ID);

  var firstVisitWidgets = facade

  .GetWidgetInstancesInZoneWithWidget(firstVisitColumn.WidgetZoneId);

  var revisitWidgets = facade

  .GetWidgetInstancesInZoneWithWidget(revisitColumn.WidgetZoneId);

  firstVisitWidgets.Each(firstVisitWidget =>

  Assert.True(revisitWidgets.Where(revisitWidget =>

  revisitWidget.Id == firstVisitWidget.Id).Count() == 1));

  });

  });

  });

  }

  });

  }

  做集成测试的正确方法是编写单元测试的对立面。在单元测试中,这种方法是通过调用一种方法和存根。在集成测试,你应该测试不仅只有一个操作,而且还执行其它相关操作,以确保测试的操作确实是它应该做的。概括了可能的测试用例分为以下类别:

  当测试创建新数据操作(例如,在数据库中插入行或调用Web服务来创建一个实体),保证了操作通过适当进行:

  调用,通过再次读取该行或调用另一个Web服务,以获得创建的实体读取数据等操作。如果数据没有被正确插入(例如,插入子行)应该失败。 这是一个积极的测试。

  调用如果插入成功,例如再次插入同一行会产生一个违反约束,将失败的其它操作。这是一种消极的考验。

  当测试的操作的更新数据(例如,更新数据库中的行),保证了操作的数据,通过适当更新

  调用使用更新后的数据,如果没有正确的更新数据会失败,例如其它的操作使余额不足的账户两次连续的汇款后。这是一个积极的测试。

  如果调用更新成功,将是失败的其它操作,例如尝试使用更新后的相同值约束冲突在数据库中插入新行。这是一种消极的考验。

原文转自:http://www.codeproject.com/Articles/44276/Unit-Testing-and-Integration-Testing-in-Business-A