簡體   English   中英

測試Jasmine測試是否失敗

[英]Testing if a Jasmine Test Fails

我正在嘗試為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");
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM