2016-04-12 15 views
1

Çok garip bir problemle karşılaştım: Uygulamamda% 100 test kapsamı elde etmek için ünite testleri yapmaya çalışıyorum. Ve tabii ki denetleyiciler için bazı testler yazdım ama Ember'de (2.4.0) ember-cli kullanarak herhangi birşeyi test etmenin bir yolu yok gibi görünüyor. Ben bu fonksiyonu kapsamalıdır bir test yazıyorumEmber kontrol cihazlarında uyumsuzluk fonksiyonlarını test eden birim

readObject() { 
    this.store.findRecord('myModel',1).then(function(obj) { 
     this.set('property1',obj.get('property2'); 
    }.bind(this)); 
} 
  • :

    1. Bunu yapan denetleyicisi bir işleve sahiptir.

      test('action readObject', function (assert) { 
          const cont = this.subject(); 
          cont.readObject(); 
          assert.equal(cont.get('property1'), 'someValue); 
      }); 
      
    2. readObject() zaman uyumsuz çağrı ama bu sorunun kökü olmadığı için obivously, bu assert işe yaramaz. Sorun şu ki, this.store.findRecord'daki bir geri arama çalıştırılıyor - denetleyicim zaten'u yok etti! Böylece "yok edilen nesneyi çağırmak" hatasını alıyorum. Başka bir deyişle

    - Bunu bir söz benim işlevini sarın ve bunun gibi her iki fonksiyonu yeniden biçimlendirmek bile:

    readObject() { 
        return new Promise(function(resolve) { 
         this.store.findRecord('myModel',1).then(function(obj) { 
          this.set('property1',obj.get('property2'); 
          resolve(); 
         }.bind(this)); 
        }.bind(this)); 
    } 
    

    ve

    test('action readObject', function (assert) { 
        const cont = this.subject(); 
        cont.readObject().then(function() { 
         assert.equal(cont.get('property1'), 'someValue); 
        }); 
    }); 
    

    Yürümezdi, sonra çünkü readObject() işlevini yürütmek, denetleyicilerimin hemen yok edilmesini sağlar, herhangi bir geri arama beklemez. Yani, örneğin Store.findRecord yerine herhangi bir async çağrısı olabilir - örneğin, Ember.run.later olabilir.

    Herkes aynı sorunu yaşıyor mu? Çok fazla makale okudum, Ember'in böylesine büyük bir topluluğa sahip olmasının, uyumsuzluk testi yapmak için bir yol sağladığına inanamıyorum.

    Herhangi bir ipucu varsa - lütfen bana bir ipucu verin, çünkü burada biraz kayboldum. Ben kontrolörleri yanlış yapıyorum

    1. , Ember bunun içinde herhangi zaman uyumsuz işlemleri varsayalım değildir: Şu anda iki düşünce var. Fakat asenkron çağrıları servislere taşıyor olsam bile, aynı problemi onlar için yazım testi yaparak vurdum.

    2. ben olması

      readObject() { 
          this.store.findRecord('myModel',1).then(this.actualReadObject.bind(this)); 
      } 
      
      actualReadObject(obj) { 
          this.set('property1',obj.get('property2'); 
      } 
      

    benim fonksiyonları ayrıştırmak zorunda testler ile kaplı en az geri aramalar vücudun en ama bu asla benim app% 100 test kapsama almak anlamına gelir.

    Herhangi bir ipucu için şimdiden teşekkür ederiz.

  • cevap

    1

    Benzer bir sorunla karşılaştım ve QUnit API - async'a bakarak çözdüm. Aşağıdaki deneyin:

    // ... in your controller ... 
    readObject() { 
        return this.store.findRecord('myModel',1).then(function(obj) { 
         this.set('property1', obj.get('property2'); 
        }.bind(this)); 
    } 
    
    // ... in your tests, either with assert.async: ... 
    const done = assert.async(); // asynchronous test due to promises usage 
    Ember.run(function(){ 
        subject.readObject().then(function(){ 
         // once you reach this point you are sure your promise has been resolved 
         done(); 
        }); 
    }); 
    
    
    // or without assert.async 
    let promise; 
    Ember.run(function(){ 
        promise = subject.readObject(); 
    }); 
    return promise; 
    

    birim testlerin bir durumda ben de, örneğin diğer bağımlılıklar alay ediyorsun: store.

    this.subject({ 
        property1: null, 
        store: { 
         findRecord(modelName, id){ 
         assert.equal(modelName, "myModel1"); 
         assert.equal(id, 1); 
         return new Ember.RSVP.Promise(function(resolve){ 
          resolve(Ember.Object.create({ property2: "a simple or complex mock" })); 
         }) 
         } 
        } 
    }); 
    

    Ben ikinci durumda (assert.async olmadan bir) konusunda emin değilim. Ben de işe yarayacağını düşünüyorum çünkü test paketi bir söz veriyor. Bu, QUnit tarafından sözünü bekleyerek kaydediliyor.

    +0

    Bir tavsiye için teşekkürler, ancak bu bir QUnit sorunu değil, bu bir Ember. :( –

    +0

    findRecord geri arama işlemini yürüttüğü zaman - kontrol cihazı kendisi zaten yok edildi.Anladığım kadarıyla - Ember sadece bir Ember.run çağrısı içinde testi yürütüyor. Bu çağrı dışında herhangi bir şey yapılırsa - uygulama zaten yok. :( –

    +0

    PS: Ben assert.async ile bu denemeyi denedim, ama o da yardımcı olmadı - findRecord çağrısı hata ile başarısız olmaya başladı: qunit beklendiği gibi çalışıyor iken "null" özelliği '_internalModel' okuyamaz. –

    0

    Burada kendi çözümümümü kopyalarım, yorumlardaki kod biçimlendirmesinin çok iyi olmaması.

    test('async', function (assert) { 
    
        const cont = this.subject(); 
        const myModel = cont.get('store').createRecord('myModel'); // 
    
        // Make store.findRecord sync 
        cont.set('store',{ 
         findRecord(){ 
         return { then : function(callback) { callback(myModel); } } 
         } 
        }); 
    
        // Sync tests 
        assert.equal(cont.get('property2'), undefined); 
        cont.readObject(); // This line calls store.findRecord underneath 
        assert.equal(cont.get('property2'), true); 
    }); 
    

    Bu yüzden store.findRecord özelliğini bir eşitleme işlevine dönüştürdüm ve mükemmel çalışıyor. Ve yine - bir ipucu için Pavol'e çok teşekkürler. :)