Vấn đề ở đây là $()
là hàm trả về đối tượng có phương thức val()
. Vì vậy, bạn phải stub $() để trả về một đối tượng stubbed có phương thức val.
$ = sinon.stub();
$.withArgs('#category').returns(sinon.stub({val: function(){}}));
Nhưng lỗi chính ở đây là để mã bạn muốn thử gọi hàm $() để tạo phiên bản mới. Tại sao? Thực hành tốt nhất của nó để tạo ra không có trường hợp mới trong lớp của bạn, nhưng để vượt qua chúng vào constructor. Hãy nói rằng bạn có chức năng đó sẽ nhận được một giá trị ra khỏi một đầu vào, tăng gấp đôi nó, và viết nó trở lại khác:
function doubleIt(){
$('#el2').val(('#el1').val() *2);
}
Trong trường hợp này, bạn tạo 2 đối tượng mới bằng cách gọi $()
. Bây giờ bạn phải cuống $()
để trả lại một mô hình và một sơ khai. Sử dụng ví dụ tiếp theo bạn có thể tránh điều này:
function doubleIt(el1, el2){
el2.val(el1.val() *2);
}
Trong khi, trong trường hợp đầu tiên bạn phải còn sơ khai $ trở lại vẫn còn sơ khai, trong trường hợp thứ hai, bạn có thể dễ dàng vượt qua một cuống và một điệp viên vào chức năng của bạn.
Vì vậy, các thử nghiệm Sinon cho một thứ hai sẽ trông như thế này:
var el1 = sinon.stub({val: function(){}});
el1.returns(2);
var el2 = sinon.spy({val: function(){}}, 'val')
doubleIt(el1, el2)
assert(el2.withArgs(4).calledOnce)
Vì vậy, khi bạn không có yếu tố dom đây, bạn chỉ có thể kiểm tra logic ứng dụng của bạn mà không cần phải tạo ra các dom giống như trong ứng dụng của bạn.
Nguồn
2011-12-15 20:57:55
Tôi đã không sử dụng một trong các thư viện đó, nhưng '$' là một đối tượng trên thực tế (các hàm là các đối tượng trong JavaScript). Ngoài ra, các hàm jQuery làm việc khi không có gì được chọn - '.val()' sẽ chỉ trả về 'undefined'. – pimvdb
Tôi nhận được rằng '.val()' sẽ trả về 'undefined', nhưng làm thế nào tôi có thể stub rằng để kiểm tra' === '' '? – swilliams