node.js에서 데이터베이스를 조롱하고 있습니까?
경우 어플리케이션에서 를 어떻게 이 경우 node.js는 "node.js"를 합니다.mongodb할 수 있습니까?
데이터베이스를 할 수 testing 나는 여전히 하는 것이 도 테스트하기 Testing.database를 .
럼럼어 떻떻 ?? ???데이터베이스 래퍼를 애플리케이션과 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();
});
});
));
데이터베이스 관련 코드는 데이터베이스 소프트웨어로 테스트하지 않고는 제대로 테스트할 수 없다고 생각합니다.왜냐하면 당신이 테스트하는 코드는 javascript뿐만 아니라 데이터베이스 쿼리 문자열이기 때문입니다.당신의 경우 쿼리가 단순해 보여도 언제까지나 그런 식이라고 믿을 수는 없습니다.
따라서 데이터베이스 에뮬레이션 계층은 반드시 전체 데이터베이스를 구현해야 합니다(디스크 스토리지 제외).그러면 유닛 테스트라고 부르더라도 데이터베이스 에뮬레이터와의 연동 테스트를 하게 됩니다.또 다른 단점은 데이터베이스 에뮬레이터가 데이터베이스와 다른 버그를 발생시키고 데이터베이스 에뮬레이터와 데이터베이스 모두에 대해 코드를 작성해야 한다는 것입니다(IE와 Firefox와 Chrome의 상황 등).
따라서 코드를 올바르게 테스트하는 유일한 방법은 실제 데이터베이스와 인터페이스하는 것입니다.
조롱에 관한 한 일반적인 경험의 법칙이 있다.
소유하지 않은 것을 비웃지 마세요.
데이터베이스를 축소할 경우 추상화된 서비스 계층 뒤에 숨기고 해당 계층을 축소합니다.그런 다음 실제 서비스 계층을 통합 테스트해야 합니다.
개인적으로 저는 테스트에 mock을 사용하는 것이 아니라 위에서 아래로 설계하는 데 사용하고 있습니다. 따라서 위에서 아래로 개발을 진행하면서 서비스 계층을 조롱하고 최종적으로 이러한 계층을 구현하고 통합 테스트를 작성합니다.테스트 도구로 사용되는 이 도구는 테스트를 매우 취약하게 만드는 경향이 있으며 최악의 경우 실제 동작과 조롱된 동작 사이의 차이를 초래합니다.
저는 지금까지 선택한 답변이나 다른 답변에 동의하지 않습니다.
QA에 도달하기 전에 DB 스키마와 코드의 혼란스럽고 여러 번 지저분한 변경으로 인해 발생한 오류를 발견할 수 있다면 멋지지 않을까요?나는 대다수의 사람들이 그렇다라고 외칠 것이라고 장담한다.
DB 스키마를 분리하여 테스트해야 합니다.또한 에뮬레이터나 무거운 이미지, DB 및 머신의 레크리에이션을 기반으로 하지 않습니다.이것이 SQLite와 같은 것의 예입니다.실행 중인 메모리 경량 인스턴스와 메모리 인스턴스에서 변경되지 않는 정적 데이터를 기반으로 시뮬레이션합니다. 즉, 실제로 DB를 격리하여 테스트하고 테스트도 신뢰할 수 있습니다.물론 고속입니다.메모리에 저장되어 있기 때문에 테스트 실행이 끝나면 폐기됩니다.
따라서 사용하는 DB 엔진/런타임에 관계없이 메모리 인스턴스에서 매우 가벼운SKEMA로 내보낸SKEMA를 테스트하여 매우 적은 양의 정적 데이터를 추가하면 분리된 가상 DB가 됩니다.
QA에 푸시하기 전에 실제 DB에서 실제 스키마를 정기적으로 내보내고 이를 메모리 DB 인스턴스로 Import/업데이트하면 DB 관리자 또는 스키마를 최근에 변경한 다른 개발자에 의해 수행된 최신 DB 변경에 문제가 있는지 즉시 알 수 있습니다.
가지고 있지 않은 것을 조롱하지 말라고 대답한 사람에 대해서는.'자신이 소유하지 않은 것을 시험하지 말라'는 뜻이었던 것 같아요.하지만 당신은 당신이 소유하지 않은 것들을 조롱합니다!왜냐하면 그것들은 격리되어야 하는 테스트 대상이 아니기 때문이다!
이것이 많은 테스트 대상 팀이 항상 하는 일입니다.그 방법을 이해하면 돼
단위 테스트 DB 코드를 어떤 언어로든 사용하는 방법은 저장소 추상화를 통해 Mongo에 액세스하는 것입니다(예: http://iainjmitchell.com/blog/?p=884).실장은 DB 고유의 기능에 따라 다르지만 Mongo 코드를 모두 자신의 로직에서 삭제함으로써 유닛 테스트의 대상이 됩니다.간단하게 Mongo Repository 구현을 stub-out 버전으로 대체하면 됩니다.이 버전은 매우 간단합니다.예를 들어 단순한 메모리 내 사전 컬렉션에 개체를 저장하기만 하면 됩니다.
DB 의존관계 없이 유닛 자체 코드를 테스트하는 이점은 얻을 수 있지만, 다른 사람들이 여기서 말한 것처럼 실제 데이터베이스의 특성을 에뮬레이트할 수 없기 때문에 메인 DB에 대해 통합 테스트를 수행해야 합니다.제가 발견한 것은 세이프 모드에서의 인덱스 작성과 세이프 모드를 사용하지 않는 경우의 인덱스 작성과 같은 간단한 것입니다.특히 고유 인덱스가 있는 경우 더미 메모리 구현은 모든 경우에 해당되지만 Mongo는 안전 모드가 없으면 불가능합니다.
따라서 일부 작업을 위해 DB에 대한 테스트가 여전히 필요하지만, 저장소 구현을 통해 자신의 논리를 제대로 테스트할 수 있습니다.
조롱의 목적은 복잡함을 건너뛰고 자체 코드를 테스트하는 것입니다.e2e 테스트를 작성하려면 db를 사용합니다.
유닛 테스트를 위해 테스트 DB를 셋업/해체하기 위한 코드를 작성하는 것은 기술적인 부채이며 매우 불만족스러운 일입니다.
npm에는 모의 라이브러리가 있습니다.
mongo - https://www.npmjs.com/package/mongomock
mongoose - https://www.npmjs.com/package/mockgoose
필요한 기능을 지원하지 않는 경우 실제 기능을 사용해야 할 수도 있습니다.
저는 이 딜레마를 안고 테스트 DB를 사용하여 테스트를 시작할 때마다 이를 정리하기로 했습니다.(모두 폐기하는 방법:https://stackoverflow.com/a/25639377/378594)
NPM을 사용하면 db 파일을 만들고 정리하는 테스트 스크립트도 만들 수 있습니다.
언급URL : https://stackoverflow.com/questions/12526160/mocking-database-in-node-js
'programing' 카테고리의 다른 글
| AngularJS $http, CORS 및 http 인증 (0) | 2023.03.08 |
|---|---|
| angular.js에서 HTML5 푸시 스테이트 사용 (0) | 2023.03.08 |
| Amazon AWS CLI에서 페이로드 매개 변수에 유효한 JSON을 허용하지 않음 (0) | 2023.03.08 |
| 숫자 키가 있는 JavaScript 개체를 배열로 변환하는 중 (0) | 2023.03.08 |
| jQuery에서 HTML 문서의 일부를 추출합니다. (0) | 2023.03.08 |