我实际上正在学习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中创建它的实例时,在Adapter的构造函数方法中传递驱动程序
我的问题是,从那时起,在实现我的代码之前,我不知道应该编写哪个测试(应该失败)。
答案 0 :(得分:1)
实际上你实际上使用的非常多。 :d
数据库适配器测试是集成测试,而不是单元测试。你不能在与数据库分离的情况下进行测试...每个测试都有相同的结构(根据phpunit手册),你有一个夹具,你在夹具上运行测试并做出断言。如果您希望测试失败,则需要编写失败的断言。例如。你有一个包含数据的数据库夹具,代码应该检索那些数据。您编写了一个断言,该断言需要代码应从数据库中检索的数据。它失败。之后,您可以处理代码。这完全由db测试。
如果一个类使用你的数据库适配器,那么你必须模拟适配器;创建一个假类,你完全控制。之后,您可以注入模拟适配器而不是真实适配器,并测试类调用它的方法。您可以将灯具注入模拟适配器。例如。你设置getAll返回带有一些数据的Promise,而不是访问数据库并发送数据查询。
我看到你使用了sinon。以下是关于模拟http://sinonjs.org/docs/#mocks-api的文档。