Chai: cách kiểm tra không xác định với cú pháp 'should'


95

Dựa trên hướng dẫn này để thử nghiệm một ứng dụng anglejs với chai, tôi muốn thêm một thử nghiệm cho một giá trị không xác định bằng cách sử dụng kiểu "should". Điều này không thành công:

it ('cannot play outside the board', function() {
  scope.play(10).should.be.undefined;
});

với lỗi "TypeError: Không thể đọc thuộc tính 'should' of undefined", nhưng kiểm tra vượt qua với kiểu "mong đợi":

it ('cannot play outside the board', function() {
  chai.expect(scope.play(10)).to.be.undefined;
});

Làm thế nào tôi có thể làm cho nó hoạt động với "should"?


1
Nó là dễ dàng nếu bạn sẽ sử dụng "khẳng định", bạn có thể làm điều đó nhưassert.isUndefined(scope.play(10))
lukaserat

Câu trả lời:


80

Đây là một trong những nhược điểm của cú pháp should. Nó hoạt động bằng cách thêm thuộc tính should vào tất cả các đối tượng, nhưng nếu giá trị trả về hoặc giá trị biến không được xác định, thì sẽ không có đối tượng để giữ thuộc tính.

Các tài liệu đưa ra một số biện pháp khắc phục, ví dụ:

var should = require('chai').should();
db.get(1234, function (err, doc) {
  should.not.exist(err);
  should.exist(doc);
  doc.should.be.an('object');
});

14
should.not.existsẽ xác thực nếu giá trị là nullvì vậy câu trả lời này không đúng. @daniel có câu trả lời dưới đây: should.equal(testedValue, undefined);. Đó phải là câu trả lời được chấp nhận.
Sebastian

7
Tôi đi đến câu trả lời này (không phải tài liệu 🙈) hàng tháng :-)
Ralph Cowling,

52
should.equal(testedValue, undefined);

như đã đề cập trong tài liệu chai


12
omg, có gì để giải thích? Bạn mong đợi TestValue === không xác định nên bạn kiểm tra nó. Rất nhiều các nhà phát triển đầu tiên đưa testedValue đầu tiên và sau đó chuỗi nó với nên và nó kết thúc với lỗi ...
daniel

5
Điều này không hoạt động ngoài hộp và nó không được tìm thấy trong tài liệu API cho.equal() . Tôi có thể hiểu tại sao @OurManInBananas yêu cầu giải thích. Đó là một cách sử dụng không mong muốn của should như một hàm chấp nhận hai đối số, thay vì biểu mẫu phương thức chuỗi được mong đợi chấp nhận một đối số duy nhất cho giá trị mong đợi. Bạn chỉ có thể đạt được điều này bằng cách nhập / yêu cầu và chỉ định phiên bản được gọi .should()như được mô tả trong câu trả lời được chấp nhận bởi @DavidNorman và trong tài liệu này .
gfullam

Tôi nghĩ rằng bạn sẽ tìm thấy rằng .equalcú pháp sản xuất nhiều thông báo lỗi tốt hơn bởi vì nó cho phép bạn thông điệp đầu ra được mô tả nhiều hơn khi mọi việc thất bại
jcollum

17

Kiểm tra không xác định

var should = require('should');
...
should(scope.play(10)).be.undefined;

Kiểm tra null

var should = require('should');
...
should(scope.play(10)).be.null;

Kiểm tra sự giả dối, tức là được coi là sai trong các điều kiện

var should = require('should');
...
should(scope.play(10)).not.be.ok;

Không đặc biệt hữu ích hoặc trực quan, nhưng đó là thông minh!
thebenedict

2
không hữu ích? Đó là câu trả lời tốt nhất cho thử nghiệm không xác định trong IMO kiểu bdd, tuy nhiên nó cần phải cài đặt gói npm khác (gói nên) và tôi không nghĩ rằng điều đó đáng để cài đặt gói khác chỉ cho điều đó, câu trả lời tuyệt vời
Wagner Leonardi


8

Tôi đã cố gắng viết câu lệnh should cho các bài kiểm tra không xác định. Sau đây không hoạt động.

target.should.be.undefined();

Tôi tìm thấy các giải pháp sau đây.

(target === undefined).should.be.true()

nếu cũng có thể viết nó dưới dạng kiểm tra loại

(typeof target).should.be.equal('undefined');

Không chắc liệu cách trên có đúng không, nhưng nó có hiệu quả.

Theo Post from ghost in github


1
Cần lưu ý rằng việc sử dụng cú pháp này có thể dẫn đến việc JavaScript diễn giải biểu thức được đặt trong ngoặc đơn như một nỗ lực để gọi dòng trước đó dưới dạng một hàm (nếu bạn không kết thúc dòng bằng dấu chấm phẩy).
bmacnaughton

5

Thử cái này:

it ('cannot play outside the board', function() {
   expect(scope.play(10)).to.be.undefined; // undefined
   expect(scope.play(10)).to.not.be.undefined; // or not
});

Cảm ơn, nhưng đó là những gì tôi đang làm trong lần thử thứ hai ở trên. Tôi muốn hiểu cách thực hiện với cú pháp should .
thebenedict

1

Câu trả lời của @ david-norman là đúng theo tài liệu, tôi gặp một số vấn đề với thiết lập và thay vào đó, tôi đã chọn cách sau.

(typeof scope.play (10)). should.be.undefined;


typeoftoán tử trả về một chuỗi ; vì vậy khẳng định này không thể được thông qua; cuz'undefined' !== undefined
dNitro 29/09/17

1

Đừng quên về sự kết hợp của havenottừ khóa:

const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');

0

Bạn có thể gói kết quả hàm của mình vào should()và kiểm tra loại "không xác định":

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.