Я пытаюсь создать модульные тесты для моего класса, который следующим образом:Использование Sinon и Chai с ES6 конструктору
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'
}
Test файл:
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)
}
}))
Вопросы, Iss ues:
- На самом деле я хочу (ed) проверить, что конструкторы зависимых классов (apiservice и redis) вызываются с правильными параметрами. Но я не мог найти способ, поэтому в настоящее время я прибегаю к одному из своих методов, чего я не хочу.
Есть ли способ в Синоне достичь этого? Нужно ли мне реструктурировать код в соответствии с требованиями Синона?
- Я также хочу предоставить тестовые значения для элементов конфигурации, например. порт, чтобы узнать, будут ли они использоваться. Опять я не мог найти способ в Синоне сделать это.
Я попробовал createStubInstance как для 1, так и для 2, но продолжаю получать ошибки.
Любые советы будут оценены.
Если вы не используете DI и ApiService, и т.д., не экспортируются как свойства, как exports.ApiService = ApiService, нет никакого способа, как вы можете имитировать/шпионить их нормально. Используйте 'rewire' или' proxyquire' для управления вызовами 'require'. – estus
Хорошо, я посмотрю на эти библиотеки, чтобы узнать, как их использовать. Почитал бы советы о том, как преобразовать выше, чтобы использовать DI и т. Д., Чтобы обеспечить нормальное издевательство –
Для DI, проверьте любую библиотеку DI, например. 'injection-js',' inversify', 'pioc'. Я не думаю, что это можно объяснить одним ответом, поскольку для этого требуется какой-то большой рефакторинг. Для существующего приложения я бы предложил придерживаться 'rewire' и так далее. – estus