[MONGODB] Node.js를에서 데이터베이스를 조롱?
MONGODBNode.js를에서 데이터베이스를 조롱?
어떻게이 경우에는 사용이 블로그 REST API의 백엔드로 MongoDB를 내 Node.js를 응용 프로그램에서 데이터베이스를 밖으로 조롱 것?
실제로 단위 테스트하지만, 통합 테스트를하고 있지 않다, 그래서 물론, 특정 테스트 - 데이터베이스에 대한 데이터베이스를 설정할 수 있습니다,하지만, 난 여전히 데이터 저장이 아닌 것 단지 내 코드를 테스트 할뿐만 아니라 데이터베이스. 그래서 하나는 어떻게해야합니까? 응용 프로그램과 DB의 중간 계층으로 데이터베이스 래퍼를 만들고 때 테스트에 DAL을 대체?
// app.js
var express = require('express');
app = express(),
mongo = require('mongoskin'),
db = mongo.db('localhost:27017/test?auto_reconnect');
app.get('/posts/:slug', function(req, res){
db.collection('posts').findOne({slug: req.params.slug}, function (err, post) {
res.send(JSON.stringify(post), 200);
});
});
app.listen(3000);
// test.js
r = require('requestah')(3000);
describe("Does some testing", function() {
it("Fetches a blogpost by slug", function(done) {
r.get("/posts/aslug", function(res) {
expect(res.statusCode).to.equal(200);
expect(JSON.parse(res.body)["title"]).to.not.equal(null);
return done();
});
});
));
해결법
-
==============================
1.나는 데이터베이스 관련 코드가 제대로 데이터베이스 소프트웨어를 테스트하지 않고 테스트 할 수 있다고 생각하지 않습니다. 그 때문에 코드 당신이있는 거 테스트 그냥 자바 스크립트가 아니라 또한 데이터베이스의 쿼리 문자열. 귀하의 경우 쿼리가 간단 보면 비록 당신은 영원히 그렇게되는에 의존 할 수 없다.
나는 데이터베이스 관련 코드가 제대로 데이터베이스 소프트웨어를 테스트하지 않고 테스트 할 수 있다고 생각하지 않습니다. 그 때문에 코드 당신이있는 거 테스트 그냥 자바 스크립트가 아니라 또한 데이터베이스의 쿼리 문자열. 귀하의 경우 쿼리가 간단 보면 비록 당신은 영원히 그렇게되는에 의존 할 수 없다.
데이터베이스 에뮬레이션 레이어는 반드시 (아마도 마이너스 디스크 스토리지) 전체 데이터베이스를 구현하는 것입니다 그래서. 그때 당신은 당신이 단위 테스트를 호출하더라도 데이터베이스 에뮬레이터와 통합 테스트를하고 결국. 또 다른 단점은 데이터베이스 에뮬레이터가 데이터베이스에 비해 버그의 다른 세트를 가진 끝낼 수 있으며, 데이터베이스 에뮬레이터 및 종류 등 크롬 대 파이어 폭스 대 IE와 상황 등의 데이터베이스 (모두 코드를 가진 끝낼 수 있다는 것이다 ).
따라서, 내 의견으로는, 올바르게 코드를 테스트 할 수있는 유일한 방법은 실제 데이터베이스와 인터페이스하는 것입니다.
-
==============================
2.그것이 조롱에 올 때 엄지 손가락의 일반적인 규칙이있다
그것이 조롱에 올 때 엄지 손가락의 일반적인 규칙이있다
소유하지 않은되지 모의 아무것도 할.
당신은 추상적 인 서비스 레이어 뒤에 DB를 숨기기에게 그것을 조롱하고 해당 레이어를 조롱합니다. 그런 다음 반드시 통합 테스트는 실제 서비스 계층합니다.
필자는 개인적으로 테스트하고 내가 가서 내가 서비스 레이어 밖으로 바닥 조롱으로 상단에서 개발 드라이브 도움이 바닥 디자인 위에서 그들을 사용하고 결국 그 레이어를 구현하고 통합 테스트를 작성하기위한 모의 객체를 사용 사라했습니다. 그들은 당신의 테스트가 매우 취성하는 경향이 테스트 도구로 실제 행동과 조롱 행동 사이의 차이에 대한 최악의 경우 리드에 사용됩니다.
-
==============================
3.지금까지 선택한 답변이나 답변에 동의하지 않는다.
지금까지 선택한 답변이나 답변에 동의하지 않는다.
당신이 품질에 도달하기 전에 지저분한는 DB 스키마 및 코드에 대한 변경 혼돈 여러 번에 의해 산란 오류를 잡을 수 있다면 굉장하지 않을까요? 나는 네 도대체 소리 것 대부분을 내기!
당신은 가장 확실하고 분리해야 할 수 있습니다 및 테스트 당신은 스키마를 DB를. 그리고 당신은 당신 DB 기계의 에뮬레이터 또는 무거운 이미지 나 레크리에이션을 기반으로하지 않습니다. 이 SQLite는 같은 물건을 그냥 하나의 예입니다 것입니다. 당신은 그것을 실행하는 메모리의 경량 인스턴스와 당신이 진정으로 격리에 DB를 테스트하고 당신이 아니라 당신의 검사 결과를 신뢰할 수 있다는 것을 의미 메모리 인스턴스이 변경되지 않는 정적 데이터를 기반으로 조롱. 이 메모리, 골격, 그리고 테스트 실행의 끝에서 폐기되어 있기 때문에 분명히 빠르다.
그래서 그래 당신은 당신이 어떤 DB 엔진의 메모리 인스턴스에 매우 경량으로 내 보낸 스키마를 테스트해야한다 / 당신이 사용하고 함께 정적 데이터의 매우 작은 금액을 추가로 당신의 DB 조롱 사업가 찾아 냈습니다가되도록하는 런타임.
당신은 (자동화 된 방식으로) 주기적으로 실제 DB에서 실제 스키마를 내보내고 가져 오기 / QA에 대한 모든 밀어 넣기 전에 메모리 DB 인스턴스에있는 당신의 빛으로 사람들을 업데이트하면 즉시 알 DB가 DB의 관리자 또는 기타에 의해 수행이 변하는 최신 경우 최근 스키마를 변경 한 개발자는 테스트를 파괴했다.
내가 대답하기 위해 최선을 다하기위한 노력에 박수를하는 동안 나는 다운 투표 현재의 대답을 것 내가 할 수하지만 난 새로운 오전과 아직 그래서 아직 할 수있는 나의 능력을 가능하게하기에 충분한 명성을 구축하지 않은 경우.
은 "당신이 소유하지 않은하지 모의 아무것도"로 대답 한 사람에 관해서. 나는 그가 "당신이 소유하지 않은 테스트 아무것도하지 않는다」라고하는 의미 생각합니다. 그러나 당신은 당신이 소유하지 않은 모의 일을! 사람들은 일이 테스트 대상이 아니기 때문에 필요가 고립되는 것을!
나는 실제 예 JS 코드에 맞춰 미래 점에서이 글을 당신과 함께 방법을 공유하고 업데이트 할 계획!
이것은 많은 시험 중심의 팀이 모든 시간을 할 것입니다. 당신은 단지 어떻게 이해해야한다.
-
==============================
4.어떤 언어로 내 선호 된 접근 유닛 테스트 DB 코드 (예를 들어 여기 http://iainjmitchell.com/blog/?p=884있다)는 저장소 추상화를 통해 액세스 몽고이다. 구현이 노출 DB의 특정 기능의 관점에서하지만 당신은 단위 테스트 할 수있는 위치에있어 자신의 논리에서 모든 몽고 코드를 제거하여 달라집니다. 간단하게 하찮게 쉬운 밖으로 스텁 버전으로 몽고 저장소 구현을 대체합니다. 예를 들어, 단지 상점은 간단한 메모리 사전 컬렉션 객체.
어떤 언어로 내 선호 된 접근 유닛 테스트 DB 코드 (예를 들어 여기 http://iainjmitchell.com/blog/?p=884있다)는 저장소 추상화를 통해 액세스 몽고이다. 구현이 노출 DB의 특정 기능의 관점에서하지만 당신은 단위 테스트 할 수있는 위치에있어 자신의 논리에서 모든 몽고 코드를 제거하여 달라집니다. 간단하게 하찮게 쉬운 밖으로 스텁 버전으로 몽고 저장소 구현을 대체합니다. 예를 들어, 단지 상점은 간단한 메모리 사전 컬렉션 객체.
당신은 당신의 자신의 코드 DB 종속성없이이 방법을 테스트 장치의 혜택을받을 수 있습니다하지만 당신은 여전히 당신은 아마 다른 사람들이 가지고있는 실제 데이터베이스의 특이성을 에뮬레이션 할 수 없을 것이기 때문에 주요 DB에 대해 통합 테스트를 수행해야합니다 여기 말했다. 내가 찾은 물건의 종류는 안전 모드없이 대 안전 모드에서 인덱싱 한 간단하다. 당신이 고유 인덱스가있는 경우 특히, 당신의 더미 메모리 구현은 모든 경우에 그 명예 수도 있지만, 몽고 안전 모드 없이는하지 않습니다.
당신은 여전히 일부 작업에 대한 DB에 대한 테스트를해야합니다 그래서 동안, 당신은 확실히 제대로 밖으로 스텁 저장소 구현과 단위 테스트 자신의 논리를 수행 할 수 있습니다.
-
==============================
5.조롱의 목적은 복잡성과 단위 테스트 코드를 직접 건너 뛸 것입니다. 당신이 쓰기 E2E 테스트하려면 다음 DB를 사용합니다.
조롱의 목적은 복잡성과 단위 테스트 코드를 직접 건너 뛸 것입니다. 당신이 쓰기 E2E 테스트하려면 다음 DB를 사용합니다.
를 설정하는 코드를 작성하는 것은 / 분해 단위 테스트 DB를 테스트하는 것은 기술적 부채와 믿을 수 없을만큼 만족스럽지입니다.
고궁 박물원에서 모의 도서관이 있습니다 :
몽고 - https://www.npmjs.com/package/mongomock
몽구스 - https://www.npmjs.com/package/mockgoose
사람들은 당신이 필요로하는 기능을 지원하지 않는 경우, 예 당신은 진짜를 사용해야 할 수도 있습니다.
-
==============================
6.나는이 딜레마를했고, 테스트 DB과 테스트가 시작됩니다 때마다 청소와 함께 작동하도록 선택. (모든 것을 드롭하는 방법 : https://stackoverflow.com/a/25639377/378594)
나는이 딜레마를했고, 테스트 DB과 테스트가 시작됩니다 때마다 청소와 함께 작동하도록 선택. (모든 것을 드롭하는 방법 : https://stackoverflow.com/a/25639377/378594)
NPM하면 심지어 DB 파일을 만들고 이후를 정리 테스트 스크립트를 만들 수 있습니다.
from https://stackoverflow.com/questions/12526160/mocking-database-in-node-js by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 : 대신 '_id'출력 'ID' (0) | 2019.12.13 |
---|---|
[MONGODB] 매일 그룹 내에서 MongoDB를 집계 [중복] (0) | 2019.12.13 |
[MONGODB] 어떻게하여 MongoDB의 핵심 기반으로 중복을 제거하는 방법? (0) | 2019.12.13 |
[MONGODB] MongoDB를이 : errno를 : 127.0.0.1:27017 이유에 연결하지 못했습니다 10061 (0) | 2019.12.13 |
[MONGODB] 중첩 된 스키마 대 몽구스 하위 문서 (0) | 2019.12.13 |