【问题标题】:TDD principle, how to make the test failTDD原理,如何让测试失败
【发布时间】:2015-10-17 02:07:20
【问题描述】:

我其实是在学习TDD之类的,我是通过例子来学习的。

实际上,我正在构建一个小的(非常非常小的)ORM 来向我介绍真正的单元测试,包括存根和模拟。

我以这种方式运行,我进行了测试并做了一些小实现(getAll 方法)(失败 -> 使测试通过 -> 重构)

实际上,这是我的代码:

MongodbAdapter

export default class MongoAdapter{
  getAll(){
    return new Promise((resolve, reject)=>{
      resolve(['a','b','c','d']);
    });
  }
}

MysqlAdapter

export default class MysqlAdapter{

  getAll(){
    return new Promise((resolve, reject)=>{
      resolve(['a','b','c','d','e']);
    });
  }
}

FactoryAdapter 类

import MysqlAdapter from './adapters/MysqlAdapter';
import MongoAdapter from './adapters/MongoAdapter';

export default class FactoryAdapter{

  static get(name){
    if(name.toLowerCase() === 'mysql') return new MysqlAdapter();
    if(name.toLowerCase() === 'mongodb') return new MongoAdapter();
    return null;
  }

}

相关的单元测试:

TestMongoAdapter

import FactoryAdapter from '../../app/FactoryAdapter';

let chai = require('chai');
let sinon = require("sinon");
let expect = chai.expect;

/** @test {MongoAdapter} */
describe('MongoAdapter class',function(){

  /** @test {MongoAdapter#getAll} */
  describe('MongoAdapter#getAll',function(){
    it('Expect getAll() to equals [a,b,c,d]',function(done){
      let adapter = FactoryAdapter.get('mongodb');
      adapter.getAll().then((value)=>{
        expect(value).to.deep.equal(['a','b','c','d']);
        done();
      });
    });
  });
});

其他两个以此类推。在这种情况下,我的问题不在于语法方式。

问题

实际上,我想在相关适配器内使用来自 MYSQL 和 MONGODB 的 DB 驱动程序。实际上,我知道我应该做什么实现:在 FactoryAdapter.get 中创建适配器的实例时,将驱动程序传递到适配器的构造方法中

我的问题是,从那时起,我不知道在实现我的代码之前我应该​​编写哪个测试(应该失败)。

【问题讨论】:

    标签: javascript node.js unit-testing tdd testdrivendesign


    【解决方案1】:

    其实你用的还蛮多的。 :D

    数据库适配器测试是集成测试,而不是单元测试。你不能将它与数据库分开测试......每个测试都有相同的结构(根据 phpunit 手册),你有一个夹具,你在夹具上运行测试并做出断言。如果你想让一个测试失败,你需要写一个失败的断言。例如。您有一个包含数据的 db 夹具,并且代码应该检索该数据。您编写一个断言,它需要代码应从数据库中检索的数据。它失败。之后,您可以处理代码。这就是 db 测试的全部内容。

    如果一个类使用你的数据库适配器,那么你必须模拟出适配器;创建一个假类,你完全控制。之后,您可以注入模拟适配器而不是真实适配器,并测试该类对其调用的方法。您可以将固定装置注入模拟适配器。例如。您设置 getAll 返回带有一些数据的 Promise,而不是访问数据库并发送数据查询。

    我看到你使用 sinon。这是关于模拟 http://sinonjs.org/docs/#mocks-api 的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2013-05-24
      • 1970-01-01
      • 2015-08-29
      相关资源
      最近更新 更多