20

我正在尝试用 Jasmine 编写一些测试,但是如果beforeEach.

示例代码如下所示:

describe("Jasmine", function() {

    var data ;

    beforeEach(function(){
        console.log('Before each');
        getSomeDataFromRemote(function(res){
            data = res;
        });
    });

    it("test1", function() {
        expect(data).toBe(something);
        console.log('Test finished');
    });

});

您可以看到,在 中beforeEach,我想从远程获取一些数据,并将其分配给data异步。

但是在 中test1,当我尝试验证时:

 expect(data).toBe(something);

数据是undefined,因为getSomeDataFromRemote还没有完成。

如何解决?

4

3 回答 3

25

就像 an 中的异步内容一样,it您可以在 beforeEach中使用runsand :waitsFor

define( 'Jasmine' , function () {
    var data ;

    beforeEach(function(){
        runs( function () {
            getSomeDataFromRemote(function(res){
                data = res;
            });
        });

        waitsFor(function () { return !!data; } , 'Timed out', 1000);
    });

    it("test1", function() {
        runs( function () {
              expect(data).toBe(something);
        });
    });
});

虽然我会假设这是因为这是测试代码,但我认为您可能应该getSomeDataFromRemote在您的内部进行调用,it因为这实际上是您正在测试的内容;)

您可以在我为异步 API 编写的一些测试中看到一些更大的示例:https ://github.com/aaronpowell/db.js/blob/f8a1c331a20e14e286e3f21ff8cea8c2e3e57be6/tests/public/specs/open-db.js

于 2012-05-10T06:20:59.550 回答
16

茉莉花2.0

要小心,因为在新的 Jasmine 2.0 中这将发生变化,它将是摩卡风格。您必须在和中使用done()函数。例如,假设您想在 LAMP 服务器中使用 jQuery 测试页面是否存在且不为空。首先,您需要将 jQuery 添加到文件中,并在您的文件中:beforeEach()it()$.getSpecRunner.htmlspec.js

describe('The "index.php" should', function() {
    var pageStatus;
    var contents;

    beforeEach(function (done) {
        $.get('views/index.php', function (data, status) {
            contents = data;
            pageStatus = status;
            done();
        }).fail(function (object, status) {
            pageStatus = status;
            done();
        });
    });

    it('exist', function(done) {
        expect(status).toBe('success');
        done();
    });

    it('have content', function(done) {
        expect(contents).not.toBe('');
        expect(contents).not.toBe(undefined);
        done();
    });
});

如您所见,您将函数done()作为beforeEach()and的参数传递it()。当你运行测试时,直到在函数中被调用it()才会启动,所以在你得到服务器的响应之前你不会启动期望。done()beforeEach()

页面存在

如果页面存在,我们会从服务器的响应中捕获状态和数据,然后调用done(). 然后我们检查状态是否为“成功”以及数据是否为空或未定义。

页面不存在

如果页面不存在,我们从服务器的响应中捕获状态,然后调用done(). 然后我们检查状态是否不是“成功”以及数据是否为空或未定义(那一定是因为文件不存在)。

于 2014-01-08T22:11:27.017 回答
3

在这种情况下,我通常会存根异步调用以立即响应。

我不确定你是否看过,但这里有一些关于 Jasmine 异步测试的文档。

于 2012-05-10T05:04:06.923 回答