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?
答案 0 :(得分:7)
一般来说,进行副作用测试是一种脆弱的做法。经常这样做,你会开始遇到一些非常难以调试的错误,即使每个测试都是孤立运行的,你的测试套件也会失败,并且错误消息不会有任何帮助。理想情况下,每个测试都应该“离开露营地”处于与其相同的状态。
如果你真的坚持这样做,你当然可以设置一个全局变量。其他一些选项包括:
合并两个测试。是的,这违反了一些人持有的单次断言的原则,但我认为避免副作用原则胜过一个原则。
将注册放在beforeEach函数中。是的,通过这样做,您将在每个测试套件运行中注册多个客户端。这仍然是我的首选方法。
答案 1 :(得分:0)
你应该使用存根。例如sinonjs。这样你就可以使用假函数来测试另一个函数。如果您只需要在beforeEach
函数中定义函数后需要存根函数,则不需要使用afterEach
和it
。
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() {
...
});
});
});