私はJasmineを初めて使用し、文字列またはnullのいずれかが予想される状況に遭遇しました。toEqual 内で or を実行しようとしましたが、奇妙な結果が得られたため、間違った方法で行っていると思われます。このような状況で最善の方法は何ですか?
おそらく、私は自分のテストについて間違っているだけです。両方の状況をテストするために 1 つのテストを行うというこの考えを破棄する必要がありますか?
describe("Jasmine", function () {
//1
it("should be able to handle any(String) || null within toEqual for string", function () {
expect("aString").toEqual(jasmine.any(String) || null);
});
//2
it("should be able to handle any(String) || null within toEqual for null", function () {
expect(null).toEqual(jasmine.any(String) || null);
});
//3
it("should be able to handle null || any(String) within toEqual for string", function () {
expect("aString").toEqual(null || jasmine.any(String));
});
//4
it("should be able to handle null || any(String) within toEqual for null", function () {
expect(null).toEqual(null || jasmine.any(String));
});
});
- 合格
Expected null to equal <jasmine.any(function String() { [native code] })>.
- 合格
Expected null to equal <jasmine.any(function String() { [native code] })>.
toBeNull() もあることに気付きましたが、これがおそらく結果が非常に不安定な理由ですが、「or」チェーンがないと、それを組み込む方法がわかりませんでした。
(Jasmine 1.3.1 リビジョン 1354556913 を実行)
解決しました!誰かが興味を持っている場合は、以下の完全なソリューション
describe("Jasmine", function () {
beforeEach(function () {
this.addMatchers({
toBeStringOrNull: function () {
var actual = this.actual;
this.message = function () {
return "Expected " + actual + " to be either string or null";
};
return typeof actual === 'string' || actual instanceof String || actual === null;
}
});
});
//1
it("should be able to handle any(String) || null within toEqual for string", function () {
expect("aString").toBeStringOrNull();
});
//2
it("should be able to handle any(String) || null within toEqual for null", function () {
expect(null).toBeStringOrNull();
});
//3
it("should be able to handle null || any(String) within toEqual for string", function () {
expect("aString").toBeStringOrNull();
});
//4
it("should be able to handle null || any(String) within toEqual for null", function () {
expect(null).toBeStringOrNull();
});
});