6

私は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));
    });
});
  1. 合格
  2. Expected null to equal <jasmine.any(function String() { [native code] })>.
  3. 合格
  4. 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();
    });
});
4

2 に答える 2

12

独自のカスタムマッチャーを作成します。

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;
}
于 2013-02-25T23:15:30.687 に答える
1

これらのケースを同じテストで確実に動作させたい場合は、独自のmatcherを作成できます。何かのようなもの

toBeStringOrNull: function() {
  var actual = this.actual;

  this.message = function () {
    return "Expected " + actual + " to be either string or null";
  }

  return jasmine.any(String) || actual === null;
}
于 2013-02-22T20:57:14.383 に答える