如何根据茉莉花单元测试中的其他对象测试功能
How to test function depending on other objects in jasmine unit test
我有一个茉莉花单元测试,用于一个名为 Event 的主干模型。
在这个模型中,我有一个函数:
getParticipants: function(){
new Myappp.Collections.UsersCollection(
this.get("participations").map(function(participation){
return participation.get("user");
});
);
}
它有 4 个依赖项:
- 用户模型
- 用户集合
- 参与模式
- 参与集合
我想单独测试所有模型,因为这是最佳实践,但我不确定如何测试。
我正在使用 sinon.js 进行嘲笑和存根,但不知道如何在这种情况下正确使用它。
谢谢!
你的方法getParticipants
做很多事情......实际上是3件事,所以我宁愿尝试让它专注于一件事:构建Myappp.Collections.UsersCollection
。并将所有以前需要的计算转移到另一种方法。
然后,您可以专注于非常棘手的问题:模拟new
电话。
我会分 3 个阶段进行:
1. 将用户过滤器移动到另一个位置
我建议将其移动到Myapp.Collections.ParticipationsCollection
中的方法,然后我们可以像这样从Event
实例中调用它:
Myapp.Models.Event =
Backbone.Model.extend({
getParticipants: function(){
var usersArray = this.get("participations").getUsers();
var participants = new Myapp.Collections.UsersCollection(usersArray);
return participants;
}
});
Myapp.Collections.ParticipationsCollection =
Backbone.Collection.extend({
getUsers: function(){
var users =
this.map(function(participation){
return participation.get("user");
});
return users;
}
});
这样,我们可以轻松地模拟getUsers
方法来测试我们的目标方法。
2. 包装,甚至更多,用户数组获得
我在上面的代码示例中,我们仍然在该行中有一个复杂的链方法调用this.get("participations").getUsers()
我们可以将其移动到自定义方法也很容易模拟:
我们以这样的内容结束:
Myapp.Models.Event =
Backbone.Model.extend({
getParticipants: function(){
var usersArray = this.getUsersArray();
var participants = new Myapp.Collections.UsersCollection( usersArray );
return participants;
},
getUsersArray: function(){
return this.get("participations").getUsers();
}
});
3. 测试集合初始化
现在我们必须专注于模拟集合Myapp.Collections.UsersCollection
,并使用适当的参数检查我们初始化和实体该集合的方法。
正确的参数是方法Event.getUsersArray()
的结果,现在我们可以很容易地模拟它。
Sinon 特别期望检查是否已使用 new
调用了方法。
我的Jasmine/Sinon 方法并不准确,因为我没有测试该方法是否返回新的集合,我希望有人能提供更好的实现:
describe("Event", function() {
beforeEach(function(){
testModel = new Myapp.Models.Event();
});
it("getParticipants returns proper Collection", function() {
var usersCollectionSpy = sinon.spy( Myapp.Collections, "UsersCollection" );
var getUsersArrayMock = sinon.stub(testModel, "getUsersArray");
getUsersArrayMock.returns( "usersArray" );
testModel.getParticipants();
expect( usersCollectionSpy.calledWith( "usersArray" ) ).toBeTruthy();
expect( usersCollectionSpy.calledWithNew() ).toBeTruthy();
});
});
检查 jsFiddle
- 如何使用object.assign()从其他对象引用基本对象属性
- PJAX:记住其他对象状态
- 以编程方式将fabric-js-canvas的图像替换为hq图像,并重新计算其他对象的坐标和大小
- AngularJS:根据其他对象预先选择ng repeat中的select元素
- 如何在 Javascript 中向数组添加其他对象
- 追加子数据 URI,替换 IE 中的其他对象
- 挖空、视图模型位于其他对象和数据绑定中
- 函数中的If语句会创建其他对象
- 对象属性引用JavaScript中的其他对象属性
- 使用map方法将javascript对象数组转换为其他对象数组
- 如何在其他对象中动态生成javascript对象.你能在对象内部使用for循环吗
- 画布对象总是在其他对象后面绘制
- JSON tv4 对象在 true 且存在其他对象时有效
- 视频 src 不会在单击其他对象时重新加载
- Javascript 调用其他对象方法
- JS - 将 和其他对象解析为相关的 HTML
- D3 - 在两个不与其他对象相交的对象之间绘制一条线
- 如何查找触摸移动到其他对象
- 反转对象与其他对象的事件耦合方式
- 将对象的属性与其他对象的属性中的值绑定