测试Jasmine测试是否失败

Testing if a Jasmine Test Fails

本文关键字:测试 失败 Jasmine 是否      更新时间:2023-09-26

我正在尝试为Jasmine编写一个插件,允许您从规范返回承诺,并将通过或失败该规范取决于承诺是否被履行或拒绝。

当然,我想写测试来确保我的插件正常工作,为了彻底,我需要确保当承诺被拒绝时测试失败…那么,当我需要确保测试"成功失败"时,我如何使测试通过呢?

在与Jasmine的开发人员讨论之后,我们得出了如下结论:

var FAILED = 'failed'
var PASSED = 'passed'
describe('My Test Suite', function () {
    var env
    beforeEach(function () {
        // Create a secondary Jasmine environment to run your sub-specs in
        env = new jasmine.Env()
    })
    it('should work synchronously', function () {
        var spec
        // use the methods on `env` rather than the global ones for sub-specs
        // (describe, it, expect, beforeEach, etc)
        env.describe('faux suite', function () {
            spec = env.it('faux test', function (done) {
                env.expect(true).toBe(true)
            })
        })
        // this will fire off the specs in the secondary environment
        env.execute()
        // put your expectations here if the sub-spec is synchronous
        // `spec.result` has the status information we need
        expect(spec.result.status).toBe(FAILED)
    })
    // don't forget the `done` argument for asynchronous specs 
    it('should work asynchronously', function (done) {
        var spec
        // use the methods on `env` rather than the global ones.
        env.describe('faux suite', function () {
            // `it` returns a spec object that we can use later
            spec = env.it('faux test', function (done) {
                Promise.reject("FAIL").then(done)
            })
        })
        // this allows us to run code after we know the spec has finished
        env.addReporter({jasmineDone: function() {
            // put your expectations in here if the sub-spec is asynchronous
            // `spec.result` has the status information we need
            expect(spec.result.status).toBe(FAILED)
            // this is how Jasmine knows you've completed something asynchronous
            // you need to add it as an argument to the main `it` call above
            done()
        }})
        // this will fire off the specs in the secondary environment
        env.execute()
    })
})

根据Joe的回答,我将假测试上下文移动到一个函数中。由于测试中的代码使用了jasmine期望,所以我将内部的Env加载到jasmine.currentEnv_中,并使用jasmine.currentEnv_.expect()显式地调用它。请注意,currentEnv_是一个由jasmine自己设置的内部变量,因此我不能保证这在将来的jasmine版本中不会被破坏。

function internalTest(testFunc) {
    var outerEnvironment = jasmine.currentEnv_;
    var env = new jasmine.Env();
    jasmine.currentEnv_ = env;
    var spec;
    env.describe("fake suite", function () {
        spec = env.it("fake test", function () {
            func();
        });
    });
    env.execute();
    jasmine.currentEnv_ = outerEnvironment;
    return spec.result;
}

然后每个测试看起来像

it("does something", function () {
    //Arrange
    //Act
    var result = internalTest(function () {
        //Perform action
    });
    //Assert
    expect(result.status).toBe("failed"); //Or "success"
    expect(result.failedExpectations.length).toBe(1);
    expect(result.failedExpectations[0].message).toBe("My expected error message");
});