728x90
stub는 기존의 함수의 인터페이스를 모두 충족하는 다른 객체
product_service_no_di_refactor.js
class ProductService_stub {
constructor(productClient) {
// Dependency Injection에 맞게
this.productClient = productClient
}
fetchAvailableItems() {
return this.productClient
.fetchItems()
.then(items => items.filter(item => item.available))
}
}
module.exports = ProductService_stub
stub_product_client.js
class StubProductClient {
async fetchItems() {
return [
{ item: '🥛', available: true },
{ item: '🍌', available: false },
]
}
}
module.exports = StubProductClient
product_service_no_di_refact.test.js
// mock과 stub의 차이점
// mock은 기존의 함수를 흉내내는것에 불과하지만
// stub는 기존의 함수의 인터페이스를 모두 충족하는 다른 객체
const ProductService_stub = require('../product_service_no_di_refactor.js')
const StubProductClient = require('./stub_product_client.js')
describe('ProductService - Stub', () => {
let productService
beforeEach(() => {
productService = new ProductService_stub(new StubProductClient())
})
it('should filter out only available items', async () => {
const items = await productService.fetchAvailableItems()
expect(items.length).toBe(1)
expect(items).toEqual([{ item: '🥛', available: true }])
})
})
728x90