Мокко показывает, что весь модульный тест не пройден
Я делаю модульное тестирование в Node js с Express js, а для тестирования я использую mocha и для насмешки данных я использую sinon. Все хорошо, но моя проблема в том, когда я запускаю контрольный пример, если it()
содержит несколько утверждений, и любой из них потерпел неудачу, то мокко показывает, что весь it()
не удалось Но я хочу, чтобы другое утверждение прошло, хотя ни одно из них не удалось. Я не хочу писать по одному it() для каждого поля. Мой тестовый код
//loading testing dependencies
var request = require('supertest');
var server = require('./app');
var chai = require('chai');
var chaiHttp = require('chai-http');
var sinon = require("sinon");
var should = chai.should();
//configuring chai
chai.use(chaiHttp);
//ORM controller (we need to mock data in it's method)
var rootController = require('./app/controllers/users/users_controller');
//Writing test cases
describe('loading express', function () {
//mock data before each request
before(function(){
//select the method of the ORM controller which you want to mock
sinon.stub(rootController, "get", //get is the method of ORM's customers_controller'
function(req, res, next){
//response object which we are going to mock
var response = {};
response.status = 'success',
response.data = {
userId: '0987654321@ef',
userName:'John'
};
next(response);
});
});
it('responds to /users/getUserData', function testMethod(done) {
//call server file (app.js)
request(server)
//send request to the Express route which you want to test
.get('/users/getUserData?id=0987654321')
//write all expactions here
.expect(200)
.end(function(err, res){
console.log("Generated response is ", res.body);
res.should.have.status(200);
res.body.should.be.a('object');
//res.body.status.should.equal("success");
res.body.data.userId.should.equal("0987654321@ef347389");
res.body.data.userName.should.equal("John");
//done is the callback of mocha framework
done();
});
});
it('responds to /', function testSlash(done) {
request(server)
.get('/')
.expect(200, done);
});
it('404 everything else', function testPath(done) {
request(server)
.get('/foo/bar')
.expect(404, done)
});
});
Здесь вы можете увидеть, что мой userId должен быть неудачным, и userName должен быть передан, но когда я запускаю этот код, он говорит, что отвечает на /users/getCustomerData. Вместо этого mocha должен сказать, что поле userId не удалось, а поле userName прошло.
1 ответ
Это не так, как мокко и should
работа: когда утверждение не выполняется, should
выдает ошибку, что означает, что остальная часть кода (включая любые последующие утверждения) не будет выполнена.
Вы можете переписать свой тест так, чтобы запрос выполнялся только один раз, но каждое утверждение все еще тестировалось отдельно:
describe('responds to /users/getUserData', function testMethod(done) {
let reqErr, reqRes;
before(function(done) {
request(server)
.get('/users/getUserData?id=0987654321')
.expect(200)
.end(function(err, res) {
reqErr = err;
reqRes = res;
done();
});
});
it('should have the correct body type', function() {
reqRes.body.should.be.a('object');
});
it('should have the correct userId', function() {
reqRes.body.data.userId.should.equal("0987654321@ef347389");
});
it('should have the correct userName', function() {
reqRes.body.data.userName.should.equal("John");
});
});