2014-02-04 3 views
1

С API-интерфейсами Rally SDK 2.0 я хочу связать новые тестовые базы с данным TestSet. Для этого I:Удалите все тестовые примеры, связанные с TestSet

  1. инициализирует магазин:

    me.selectedTestCasesStore = myTestSet.getCollection('TestCases',{...}); 
    
  2. Удалить все элементы (я не хочу, чтобы держать их):

    me.selectedTestCasesStore.removeAll(); 
    
  3. Добавить новые TestCases

    me.selectedTestCasesStore.add({'_ref':aTestCaseRecord.data._ref}); 
    
  4. Затем синхронизировать

    me.selectedTestCasesStore.sync({...}); 
    

Шаг 1 ОК: console.log(me.selectedTestCasesStore) показывает мне коллекцию в data.items[].

Шаг 2 кажется ОК как console.log(me.selectedTestCasesStore) ничего не показывает в data.items[] (предыдущие записи исчезли).

Шаг 3 в порядке, потому добавлены тестовые случаи, которые не присутствовали на шаге 1, в настоящее время в коллекции

Шаг 4: Вызывается функция «Успех»

НО ... только новые TestCases , старые не удаляются, как если бы шаг 2 не влиял. Что случилось в моем коде? Я извлекаю часть соответствующего кода:

// me.selectedTestCasesStore : my store, with old TestCase associated to a TestSet. 
// It is initialized with something like : 
// me.selectedTestCasesStore = myTestSet.getCollection('TestCases',{...}); 
// 
// selectedTestCasesArray : an array of records with the new TestCases to assign to the test set. 


_removeAllFromSelectedTestCaseStore:function() 
{ 
    var me = this ; 
    console.log('In _removeAllFromSelectedTestCaseStore'); 

    me.selectedTestCasesStore.addListener({ 
     clear : me._addSelectedTestCasesToSelectedTestCaseStore, 
     scope : me, 
    }); 

    // Remove all associated TestCases from selectedTestCases store 
    me.selectedTestCasesStore.removeAll(); 
}, 


_addSelectedTestCasesToSelectedTestCaseStore:function() 
{ 
    var me = this ; 
    console.log('In _addSelectedTestCasesToSelectedTestCaseStore'); 

    console.log('  After remove, store is now :',me.selectedTestCasesStore); 

    // Add each check TestCase to selectedTestCases store 
    for (var i=0; i < me.selectedTestCasesArray.length; i++) 
    { 
     // Add it to the collection 
     me.selectedTestCasesStore.add({'_ref':me.selectedTestCasesArray[j].data._ref}); 
    } 

    console.log('  After add, store is now :',me.selectedTestCasesStore); 

    // Synchronyze 
    me.selectedTestCasesStore.sync(
    { 
     success: function(batch, options) { 
      //success! 
      console.log('  Success', me.selectedTestSetStore); 
     }, 
     failure: function(batch, options){ 
      console.log('  Faillure :(', me.selectedTestSetStore); 
     }, 
    }); 
}, 

Благодарим за помощь!

ответ

1

Это работает для меня вместо RemoveAll():

var testcases = testCaseStore.getRange(); 
_.each(testcases, function(testcase) { 
    testCaseStore.remove(testcase); 
}); 

Вот полный JS файл, который опустошает коллекцию случай тест на тестовом наборе, прежде чем добавить новый тестовый случай

Ext.define('CustomApp', { 
    extend: 'Rally.app.App', 
    componentCls: 'app', 

    launch: function() { 
     console.log("launch"); 
     Rally.data.ModelFactory.getModel({ 
      type: 'TestSet', 
      success: this._onModelRetrieved, 
      scope: this 
     }); 
    }, 
    _onModelRetrieved: function(model) { 
     console.log("_onModelRetrieved"); 
     this.model = model; 
     this._readRecord(model); 
    }, 

    _readRecord: function(model) { 
     var id = 16805375409; 
     console.log("_readRecord"); 
     this.model.load(id, { 
      fetch: ['Name', 'FormattedID', 'TestCases'], 
      callback: this._onRecordRead, 
      scope: this 
     }); 
    }, 

    _onRecordRead: function(record, operation) { 
     console.log('name:', record.get('Name')); 
     console.log('test cases:', record.get('TestCases')); 
     if(operation.wasSuccessful()) { 
      var testCaseStore = record.getCollection('TestCases', { 
       autoLoad: true, 
       listeners: { load: function() { 
        var testcases = testCaseStore.getRange(); 
        _.each(testcases, function(testcase) { 
         testCaseStore.remove(testcase); 
        }); 
        testCaseStore.sync({ 
          callback: function() { 
          console.log('test cases after removeAll():', record.get('TestCases')); 
         } 
         }); 
        testCaseStore.add({'_ref':'/testcase/14469886070'}); 
        testCaseStore.sync({ 
         callback: function() { 
          console.log('test cases after add():', record.get('TestCases')); 
         } 
        }); 
       }} 
      }); 
     } 

    }, 
}); 
+2

Это кажется, является ошибкой с использованием removeAll, но вышеописанное решение должно получить вас ... –

+1

Спасибо, обходное решение работает. Но, возможно, другие ошибки в API: во-первых, если я не перезагружаю testCaseStore после первой синхронизации, добавление и вторая синхронизация не имеют эффектов: мой набор тестов пуст, ничего не добавлено. Если я перезагружу testCaseStore после первой синхронизации, все в порядке, старые тестовые окна будут удалены, а новые будут добавлены. И затем, если testCaseStore пуст, прежде чем удалить его, никто из вызова обратного вызова не будет вызван. Теперь, с обходным решением и перезагрузкой после синхронизации, это работает! –

Смежные вопросы