如何编写mocha测试,其中一个测试取决于下一个测试的结果?

时间:2014-02-11 14:10:56

标签: node.js unit-testing express mocha

describe("Company Controller", function() {
  var apiUrl;

  beforeEach(function(done) {
    apiUrl = "http://localhost:3001";

    done();
  });

  it('should register a client without error and return an API key', function(done) {
    request({
      uri: apiUrl + '/api/v1/company',
      method: 'POST',
      json: true,
      form: {
        name: 'My Company'
      }
    }, function(err, res, body) {
      should.not.exist(err);
      res.statusCode.should.eql(200);
      body.status.should.eql('ok');
      should.exist(body.company.api_key);
      done();
    });
  });

  it('should generate a new API key for a company', function(done) {
    // NEED THE client_id generated in the previous test

  });

  after(function(done) {
    Company.remove().exec();
    done();
  });
});

如何在下一次测试中获取client_id?

2 个答案:

答案 0 :(得分:7)

一般来说,进行副作用测试是一种脆弱的做法。经常这样做,你会开始遇到一些非常难以调试的错误,即使每个测试都是孤立运行的,你的测试套件也会失败,并且错误消息不会有任何帮助。理想情况下,每个测试都应该“离开露营地”处于与其相同的状态。

如果你真的坚持这样做,你当然可以设置一个全局变量。其他一些选项包括:

  • 合并两个测试。是的,这违反了一些人持有的单次断言的原则,但我认为避免副作用原则胜过一个原则。

  • 将注册放在beforeEach函数中。是的,通过这样做,您将在每个测试套件运行中注册多个客户端。这仍然是我的首选方法。

答案 1 :(得分:0)

你应该使用存根。例如sinonjs。这样你就可以使用假函数来测试另一个函数。如果您只需要在beforeEach函数中定义函数后需要存根函数,则不需要使用afterEachit

describe("Company controller", function() {
  describe("dependantFunction()", function() {
    var stub;

    beforeEach(function() {
      stub = sinon.stub(module, 'targetFunction');

      stub.onCall(0).callsArgWith(1, ...some valid results...);
      stub.onCall(1).callsArgWith(1, ...some expected error...);
      stub.throws();
    });

    afterEach(function() {
      stub.restore();
    });

    it("should do something", function() {
       var result;

       module.targetfunction(null, result);
       dependantfunction(result);
       ....your tests here....
    });

    it("should do something else", function() {
      ...
    });
  });
});