修复此测试:功能反应编程教程

时间:2015-12-24 08:54:30

标签: javascript oop jasmine reactive-programming rxjs

我正在http://reactivex.io/learnrx/学习本教程。我在练习19 - 用初始值减少: 有时当我们减少数组时,我们希望减少的值与存储在数组中的项不同。假设我们有一系列视频,我们希望将它们缩小为单个地图,其中键是视频ID,值是视频的标题。

就教程而言,我已经解决了这个问题:

function exercise19() {
    var videos = [
        {
            "id": 65432445,
            "title": "The Chamber"
        },
        {
            "id": 675465,
            "title": "Fracture"
        },
        {
            "id": 70111470,
            "title": "Die Hard"
        },
        {
            "id": 654356453,
            "title": "Bad Boys"
        }
    ];

  return videos.reduce(function(accumulatedMap, video) {
      var copyOfAccumulatedMap = Object.create(accumulatedMap);
      copyOfAccumulatedMap[video.id] = video.title; // <-- My solution

      return copyOfAccumulatedMap;
  }, {});
} // end of overall function

要验证您的解决方案,请点击“运行”。如果它正确运行,那么你可以继续下一个练习。我做了,它给了我下一个练习。我的测试套件以不同的方式告诉我。

在尝试解决问题时,我创建了这个测试:

 it("should be able to reduce to an object with id's for keys", function() {

    var output = [{
      "65432445": "The Chamber",
      "675465": "Fracture",
      "70111470": "Die Hard",
      "654356453": "Bad Boys"
    }];

    expect(exercise19()).toEqual(output);

  }); // end it

(我从教程中得到了输出。)

我遇到的问题是测试仍然失败:

  

预期[对象({654356453:'Bad Boys'})]等于[Object({   65432445:'The Chamber',675465:'Fracture',70111470:'Die Hard',   654356453:'坏男孩'})]。

所以看起来它只是在测试中选择了最后一个属性,即'坏男孩'属性。我认为,通过减少工作和Object.create的方式,其他属性在那里,但它们在原型上。我怎样才能通过这个测试..?

更新:

我在拉请求中解决了这个问题。这些教程没有使用Object.assign,而是使用Object.create。它现在可以测试了。 : - )

2 个答案:

答案 0 :(得分:1)

它似乎是Jasmine toEqual的已知问题 - 它只是忽略原型中的属性。你可能可以在测试中使用类似的东西:

// ...
expect(exercise19()).toEqual(jasmine.objectContaining({
  "654356453": "Bad Boys"
  // rest data here
}));

答案 1 :(得分:0)

Object.create使用第一个参数中指定的对象的原型创建一个新对象 - 你根本没有复制对象,你正在用Object的原型创建一个新对象 - 即你做了很长时间winded var copyOfAccumulatedMap = {}

相反,这样做

return videos.reduce(function(accumulatedMap, video) {
    accumulatedMap[video.id] = video.title;
    return accumulatedMap;
}, {});