【发布时间】:2017-06-29 02:15:16
【问题描述】:
我正在尝试为我的班级创建单元测试,如下所示:
MyService.js:
const ApiServce = require('./api-service')
const Config = require('./config')
const Redis = require('ioredis')
class MyService {
constructor () {
const self = this
self.apiService = new ApiServce('MyService', '1.0.0', Config.port)
self.registerRoutes() //this invokes self.apiSerivce.registerRoutes
self.redis = new Redis(Config.redisport, Config.redishost)
self.queueKey = Config.redisqueuekey
}
run () {
const self = this
self.apiService.run()
}
}
module.exports = MyService
Config.js
module.exports = {
port: process.env.SVC_PORT || 8070,
redishost: process.env.REDIS_HOST || '127.0.0.1',
redisport: process.env.REDIS_PORT || 6379,
redisqueuekey: process.env.REDIS_Q_KEY || 'myeventqueue'
}
测试文件:
const Redis = require('ioredis')
const MyService = require('../src/myservice')
const ApiService = require('../src/api-service')
const Chai = require('chai')
const Sinon = require('sinon')
const SinonChai = require('sinon-chai')
Chai.use(SinonChai)
const should = Chai.should()
const expect = Chai.expect
describe('MyService', function () {
let apiservicestub, redisstub, apiconststub
beforeEach(function () {
apiservicestub = Sinon.stub(ApiService.prototype, 'registerRoutes')
redisstub = Sinon.stub(Redis.prototype, 'connect')
redisstub.returns(Promise.resolve())
})
describe('.constructor', function () {
it('creates instances of api service and redis client with correct parameters', Sinon.test(function () {
try {
const service = new MyService()
expect(apiservicestub).called
expect(redisstub).called
} catch (e) {
console.error(e)
expect(false)
}
}))
问题,问题:
- 我实际上想要(ed)测试依赖类(apiservice 和 redis)的构造函数是否使用正确的参数被调用。但我找不到方法,所以我目前正在诉诸他们的一种方法,这不是我想要的。
诗乃有没有办法做到这一点?我需要重构代码以适应诗浓的要求吗?
- 我还想为配置项提供测试值,例如端口,看看他们是否被使用。再一次,我在诗浓找不到办法做到这一点。
我也尝试了 1 和 2 的 createStubInstance,但不断出错。
我们将不胜感激。
【问题讨论】:
-
如果你不使用DI和ApiService等不作为属性导出,比如exports.ApiService = ApiService,你就无法正常模拟/窥探它们。使用
rewire或proxyquire控制require调用。 -
好的,我会看看这些库,看看如何使用它们。希望获得有关如何将上述内容转换为使用 DI 等以允许正常模拟的提示
-
对于 DI,检查任何 DI 库,例如
injection-js、inversify、pioc。我认为这不能用一个答案来解释,因为它需要一些重大的重构。对于现有的应用程序,我建议坚持使用rewire等等。
标签: ecmascript-6 sinon