この問題は、コントローラーや単体テストなどで関連オブジェクトのプロパティにアクセスしようとした場合など、テンプレートの外部でのみ発生することを強調したいと思います。テンプレートをレンダリングすると、プロパティが適切に取得され、期待どおりに動作するようです。
これは、失敗したテストhttp://jsbin.com/ihumuk/4/editを含むJS Bin の簡単な例で、私の問題を再現しています。テストに合格すると、プロパティがアクセス可能であり、テンプレートで期待どおりにレンダリングされることがアサートされます。失敗したテストはnull
、 でプロパティにアクセスしようとすると得られることを示していますget
。ここでは何も空想はありませんが、なぜ戻ってくるのかわかりませんnull
。
JS Bin の例のアプリケーション部分は次のとおりです。
App.ApplicationRoute = Em.Route.extend({
model: function() {
return App.Foo.find();
}
});
App.Store = DS.Store.extend({
adapter: DS.FixtureAdapter.create()
});
App.Foo = DS.Model.extend({
name: DS.attr("string"),
/**
* The subject under test
*/
childName: function() {
return this.get("child.name");
}.property("child.name"),
child: DS.belongsTo("App.Bar")
});
App.Bar = DS.Model.extend({
name: DS.attr("string")
});
App.Foo.FIXTURES = [{
id: 1,
name: "Fred",
child: 3
}, {
id: 2,
name: "Barney",
child: 4
}];
App.Bar.FIXTURES = [{
id: 3,
name: "Pebbles"
}, {
id: 4,
name: "Bam Bam"
}];
これはパスします。
test("Child name is rendered", function() {
expect(1);
visit("/").then(function() {
ok(find("div:contains(Pebbles)").length);
});
});
これは失敗します。
test("Child name is accessed", function() {
expect(2);
var foo = App.Foo.find(1);
equal(foo.get("childName"), "Pebbles");
equal(foo.get("child.name"), "Pebbles");
});
これは、キャラクターを忘れるなどの単純/愚かなことでなければなりませんが、しばらくの間、はっきりと考えることができないほど欲求不満に陥っていると思います. 助けてくれてありがとう。