Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单元测试w/Sinon:如何在回调中测试变量?_Javascript_Unit Testing_Mocha.js_Sinon - Fatal编程技术网

Javascript 单元测试w/Sinon:如何在回调中测试变量?

Javascript 单元测试w/Sinon:如何在回调中测试变量?,javascript,unit-testing,mocha.js,sinon,Javascript,Unit Testing,Mocha.js,Sinon,我和Sinon一起做了一个单元测试,至少试着让一些东西通过,但我运气不好。我在网上找不到任何东西 我有两个问题: 我试图得到一个简单的回答,但它没有说间谍是假的。当我记录它时,它说这是真的 2我想测试回调函数中的模板是否等于“New Title”。我不知道如何将req、res和next传递到router.get 路由器.js router.spec.js 我想访问路由处理程序,以便进行进一步测试。在这种情况下,在何处以及如何实现路由处理?用于路由的Express app通常最好使用集成测试进行测

我和Sinon一起做了一个单元测试,至少试着让一些东西通过,但我运气不好。我在网上找不到任何东西

我有两个问题:

我试图得到一个简单的回答,但它没有说间谍是假的。当我记录它时,它说这是真的

2我想测试回调函数中的模板是否等于“New Title”。我不知道如何将req、res和next传递到router.get

路由器.js router.spec.js
我想访问路由处理程序,以便进行进一步测试。在这种情况下,在何处以及如何实现路由处理?

用于路由的Express app通常最好使用集成测试进行测试,而不是您尝试进行的单元测试。可作为图书馆使用

我们可以做的另一个改进是将生成模板的逻辑分离到另一个文件中。对于这个服务,我们可以对它进行单元测试。使用或可以是选项

例如:

const request = require('supertest');
const express = require('express');
const service = require('./service'); // our new service file
const app = express();

app.get('/', function(req, res) {
  const template = service.getTemplate(req);
  res.render('index', template);
});

// integration test, ideally must be separated into a test file e.g. app-integration-test.js

request(app)
  .get('/')
  .expect('Content-Type', /json/)
  .expect('Content-Length', '15')
  .expect(200)
  .end(function(err, res) {
    if (err) throw err;
  });


// service.js

function getTemplate(req, res) {
  return {
    title: req.title,
    item: req.item,
    description: 'N/A'
  };
}

// service-unit-test.js

describe('service test', function() {
  it('returns template correctly', function() {
    const req = {
      title: 'someone',
      item: 'my item',
    }
    const template = service.getTemplate(req);

    expect(template).to.eql({
      title: 'someone',
      item: 'my item',
      description: 'N/A'
    })
  })
})
希望有帮助

你应该读书。这超出了单元测试的范围。您需要按照@deerawan的建议编写适当的集成测试
const router = require('./router');
var res = {};
var req = {
  title: 'New Title',
  item: 'Blank Item'
};
var template = {
  title: req.title,
  item: req.item,
  description: 'N/A'
};


it('1) should call the response', ()=>{
 var spy = sinon.spy(route, 'get');
 route.get('/', ()=>{});
 console.log(spy.calledOnce); // equals true
 assert(spy.calledOnce).toBeTruthy();
 spy.restore();
});

it('2) should return a status 200', ()=>{
 var stub = sinon.stub().yield([req, res, next]);
 route.get('/', stub); // main problem
 assert.equal(200, res.statusCode);
 stub.restore();
});

const request = require('supertest');
const express = require('express');
const service = require('./service'); // our new service file
const app = express();

app.get('/', function(req, res) {
  const template = service.getTemplate(req);
  res.render('index', template);
});

// integration test, ideally must be separated into a test file e.g. app-integration-test.js

request(app)
  .get('/')
  .expect('Content-Type', /json/)
  .expect('Content-Length', '15')
  .expect(200)
  .end(function(err, res) {
    if (err) throw err;
  });


// service.js

function getTemplate(req, res) {
  return {
    title: req.title,
    item: req.item,
    description: 'N/A'
  };
}

// service-unit-test.js

describe('service test', function() {
  it('returns template correctly', function() {
    const req = {
      title: 'someone',
      item: 'my item',
    }
    const template = service.getTemplate(req);

    expect(template).to.eql({
      title: 'someone',
      item: 'my item',
      description: 'N/A'
    })
  })
})