ich eine Modellfunktion für mongodb mit node-mongodb-native
implementiert:node.js - Bewerben sinon auf mongodb Einheit testet
'use strict';
const mongo = require('mongodb');
class BlacklistModel {
constructor(db, tenant_id, logger) {
this._db = db;
this._table = 'blacklist_' + tenant_id;
this._logger = logger;
}
create(data) {
return new Promise((resolve, reject) => {
const options = {
unique: true,
background: true,
w: 1
};
this._db.collection(this._table).ensureIndex({ phone: 1 }, options, (err) => {
if (err) {
this._logger.error(err);
reject(err);
} else {
const datetime = Date.parse(new Date());
data._id = new mongo.ObjectID().toString();
data.createdAt = datetime;
data.updatedAt = datetime;
this._db.collection(this._table).insertOne(data, (err) => {
if (err) {
this._logger.error(err);
reject(err);
} else {
resolve(data);
}
});
}
});
});
}
}
module.exports = BlacklistModel;
Jetzt möchte ich Unit-Tests für sie schreiben, 3 Fälle Berücksichtigung
- Eine erfolgreiche Insertion
- Ausfallen wegen Verstoßes gegen eindeutigen Index
- Ausfallen aufgrund verlorener Verbindung
jene in den Köpfen Lager, hier sind meine Tests:
'use strict';
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
const expect = chai.expect;
const BlacklistModel = require('../../model/blacklist');
const mongo_url = require('../../config/mongodb');
const MongoClient = require('mongodb').MongoClient;
const logger = require('../../config/logger');
const data = {
name: 'admin'
};
describe('Model: Blacklist',() => {
let Blacklist;
let connected = false;
let test_db;
const connect =() => new Promise((resolve, reject) => {
MongoClient.connect(mongo_url, (err, db) => {
if (err) {
reject(err);
} else {
Blacklist = new BlacklistModel(db, 'test', logger);
connected = true;
test_db = db;
resolve();
}
});
});
before(() => connect());
describe('create',() => {
let id;
beforeEach(() => connected ?
null : connect());
it('Should return an inserted document',() => {
return Blacklist.create(data).then(
(result) => {
expect(result._id).to.be.a('string');
expect(result.name).to.equal(data.name);
expect(result.createdAt).to.be.a('number');
expect(result.updatedAt).to.be.a('number');
id = result._id;
});
});
it('Should fail to insert a blacklist with the same name',() => {
const promise = Blacklist.create(data).then(
(result) => {
id = result._id;
return Blacklist.create(data);
});
return expect(promise).to.be.rejected;
});
it('Should fail due to lost connection',() => {
return test_db.close(true).then(() => {
connected = false;
return expect(Blacklist.create(data)).to.be.rejected;
});
});
afterEach(() => connected ?
Blacklist.delete(id) : connect().then(() => Blacklist.delete(id)));
});
});
Ich nenne reelle Funktionen in Tests, die scheinbar umständlich und zeitraubend ist in Runtime Nebenwirkungen in meiner bescheidenen Meinung nach zu vermeiden. Aber zur Zeit habe ich keine anderen Ideen außer der Änderung einer Testdatenbank. Gibt es eine Möglichkeit, sinon
zu verwenden? Ich habe mehrere Blogs über sinon
, Spion, Stub und Spott gelesen, aber kämpfen, um sie zu verstehen und zu unterscheiden. Wie kann ich sie auf diese Tests anwenden?
Ich bin immer noch sehr verwirrt, wie 'sinon' zu verwenden, um diese Methoden zu Stummel. Könnten Sie mir ein Beispiel für diese obigen Codes schreiben? – necroface
Ich habe gerade ein Update geschrieben, dass Sie versuchen könnten –
Vielen Dank, es hilft tatsächlich – necroface