Jasmine.js เปรียบเทียบอาร์เรย์


205

มีวิธีในการ jasmine.js เพื่อตรวจสอบว่าสองอาร์เรย์มีค่าเท่ากันหรือไม่ตัวอย่างเช่น

arr = [1, 2, 3]
expect(arr).toBe([1, 2, 3])
expect(arr).toEqual([1, 2, 3])

ดูเหมือนว่าจะไม่ทำงาน

คำตอบ:


341

เพิ่งทำการทดสอบและใช้งานได้ toEqual

กรุณาค้นหาการทดสอบของฉัน:

http://jsfiddle.net/7q9N7/3/

describe('toEqual', function() {
    it('passes if arrays are equal', function() {
        var arr = [1, 2, 3];
        expect(arr).toEqual([1, 2, 3]);
    });
});

สำหรับข้อมูลเท่านั้น:

toBe () และ toEqual (): toEqual () ตรวจสอบความเท่าเทียมกัน ในทางกลับกัน toBe () ตรวจสอบให้แน่ใจว่าเป็นวัตถุเดียวกัน


อืมขอบคุณดูเหมือนว่าปัญหาคือว่าอาร์เรย์ที่ฉันเปรียบเทียบถูกแก้ไขดังนั้นจึงทำบางสิ่งบางอย่างเช่น arr = [1, 2, 3] arr ['pop'] = function () {... } คาดหวัง (arr) .toEquals ([1, 2, 3])
user2032804

2
วิธีการทดสอบว่าค่าเท่ากันภายใน epsilon? เช่นการทดสอบของฉันล้มเหลวคาดหวัง [-9, -6, 6, 3, 1.0000000000000004, 2] ให้เท่ากับ [-9, -6, 6, 3, 1, 2]
morpheus

@morpheus - ฉันได้ลองแล้วtoBeCloseTo(expected,2)แต่ดูเหมือนจะไม่ทำงาน
cod3monk3y

อาร์กิวเมนต์ที่สองของ toBeCloseTo คือ # ของตำแหน่งทศนิยมที่จะเปรียบเทียบกัน
morpheus

1
ซึ่งตรงกับ "==" ในจาวาสคริปต์โดยค่าเริ่มต้น สิ่งนี้ไม่ปลอดภัยเนื่องจากไม่เพียง แต่เปรียบเทียบค่าจริงเท่านั้น แต่ยังรวมวัตถุทั้งหมด
ปีเตอร์

0

คุณสามารถเปรียบเทียบอาร์เรย์ตามที่ระบุไว้ด้านล่างหากอาร์เรย์มีค่าบางค่า

it('should check if the array are equal', function() {
        var mockArr = [1, 2, 3];
        expect(mockArr ).toEqual([1, 2, 3]);
 });

แต่ถ้าอาเรย์ที่ส่งคืนจากฟังก์ชั่นบางอย่างมีมากกว่า 1 องค์ประกอบและทั้งหมดเป็นศูนย์ให้ตรวจสอบโดยใช้

expect(mockArray[0]).toBe(0);

-3

เพียงบันทึกคุณสามารถเปรียบเทียบการใช้ JSON.stringify

const arr = [1,2,3]; expect(JSON.stringify(arr)).toBe(JSON.stringify([1,2,3])); expect(JSON.stringify(arr)).toEqual(JSON.stringify([1,2,3]));

ทุกอย่างมีรสชาติเมตรและใช้ได้กับวัตถุที่ซับซ้อนเช่นกัน


ทำไมเราต้องการความแตกต่างระหว่าง toBe และ toEqual
Luca Borrione

ไม่มีความแตกต่างฉันแค่อยากปล่อยให้มันดูเหมือนคำถาม
Ohad Sadan

มีความแตกต่างระหว่าง toBe และ toequal OP ไม่แน่ใจเกี่ยวกับ คำตอบควรชี้แจงสิ่งต่าง ๆ แทนที่จะแสดงการใช้ที่ไม่เหมาะสม คำตอบที่ยอมรับมีอยู่แล้วคำตอบของคุณอาจทำให้เกิดความสับสนมากขึ้นซึ่งแสดงให้เห็นว่าจะบังคับให้ดอกมะลิทำงานในลักษณะที่ไม่ได้ตั้งใจให้ทำงานได้
Luca Borrione

-4

ฉันมีปัญหาคล้ายกันซึ่งมีการแก้ไขหนึ่งในอาร์เรย์ ฉันใช้มันเพื่อ$httpBackendและวัตถุที่ส่งคืนจากที่จริงแล้วเป็น$promiseวัตถุที่มีอาร์เรย์ (ไม่ใช่Arrayวัตถุ)

คุณสามารถสร้างตัวจับคู่ดอกมะลิเพื่อจับคู่อาร์เรย์โดยสร้างtoBeArrayฟังก์ชัน:

beforeEach(function() {
  'use strict';
  this.addMatchers({
    toBeArray: function(array) {
      this.message = function() {
        return "Expected " + angular.mock.dump(this.actual) + " to be array " + angular.mock.dump(array) + ".";
      };
      var arraysAreSame = function(x, y) {
         var arraysAreSame = true;
         for(var i; i < x.length; i++)
            if(x[i] !== y[i])
               arraysAreSame = false;
         return arraysAreSame;
      };
      return arraysAreSame(this.actual, array);
    }
  });
});

และจากนั้นก็ใช้ในการทดสอบของคุณเช่นจัสมิน matchers อื่น ๆ :

it('should compare arrays properly', function() {
  var array1, array2;
  /* . . . */
  expect(array1[0]).toBe(array2[0]);
  expect(array1).toBeArray(array2);
});

2
ฉันได้รับ TypeError: this.addMatchers ไม่ใช่ฟังก์ชั่น
AndyTheEntity

4
"การ arraysAreSame" ฟังก์ชั่นที่คุณให้จะให้บวกปลอมสำหรับอาร์เรย์x=[1,2], y=[1,2,3]เพราะมันจะตรวจสอบเฉพาะครั้งแรกx.lengthองค์ประกอบ คุณสามารถแก้ไขได้โดยตรวจสอบif (x.length !== y.length) { return false; }ล่วงหน้า
warchinal

1
@AndyTheEntity "ฟังก์ชั่น addMatchers ไม่ได้อยู่ใน spec (นี่) ตอนนี้มันอยู่ในวัตถุดอกมะลิระดับโลก" - ดูเอกสารของจัสมิน
59

for (var i; ...)=> x[undefined], var arraysAreSame = function ... var arraysAreSame = true:(
André Werlang

@warchinal expect([1]).toBeArray([2])ตลกก็ยังล้มเหลวในการจับ และยังมีอาร์เรย์อื่น ๆ จริงๆเพราะundefined + 1 => NaN
André Werlang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.