单元测试中的模拟对象

时间:2013-11-19 01:36:34

标签: unit-testing mocking dart

这可能是过度的,但我无法理解它是什么,以及何时/为何使用它。由于我正在学习dart,我将在dart中提供我的示例,我希望我也会在dart中得到答案。我也是单元测试的新手。

想象一下,我有3个班级,PersonTranslatorDbPerson可以进行查询,Translator可以翻译Person提供的查询,因此Db可以对其进行处理。

class Person {
  query(String args, Translator translator) => 
      translator.query(args);
}

class Translator {
  Db db;

  Translator(this.db);

  query(args) => db.query(args); // assuming Translator knows what the db type is
}

class Db {
  String type;

  Db(this.type);

  query(args) => // query with args, return the result;
}

现在我想测试Translator是否表现良好:

void main() {
  var mongoDB = new Db('mongodb'),
      translator = new Translator(mongoDB),
      person = new Person(),
      result = person.query('give me 1 Person named Andy', translator); // get the result

  expect(result['name'], equals('Andy'));
}

根据我的阅读,如果我有上述案例,Translator依赖于DbDb io,则会使用模拟。

我应该模拟哪个课程,TranslatorDb

以什么方式/我如何模拟课程?

我从嘲笑中获得了什么好处?

1 个答案:

答案 0 :(得分:1)

模拟框架的主要目的是模拟代码中与外部系统的集成。如果您不模拟依赖项,那么您正在编写集成测试,而不是单元测试。这样做的一大好处是您不依赖于外部系统中的现有数据(数据库中的数据等)。还有一个性能优势,因为您不必对外部系统进行可能的慢速调用。