2016-09-26 4 views
0

У меня есть функция:

function validateClub(club) { 
    //.. other validation 

    let existingClub 
    $http.get('/clubs/fetch/' + club.clubName).then(data => { 
    existingClub = data 
    }, err => { 
    $log.error(err) 
    }) 

    console.log(existingClub) 

    if(existingClub) return {result: false, reason: 'Club already exists. Choose another Club Name'} 

    return {result: true} 
} 

и я называю это так:

function createClub(club) { 
    let validationResult = validateClub(club) 
    console.log(validationResult) 
    if (validationResult.result === false) { 
    throw new Error('The Club you entered has failed validation reason: ' + validationResult.reason) 
    } 

    // .. create club logic 
} 

Где createClub() вызывается из углового контроллера. Мне еще не нужно писать контроллер, поскольку я застрял с тестом. Я использую ngMocks $ httpBackend подделать ответ, как это:

describe.only('when creating a new club with an existing clubName',() => { 
    it('should throw exception',() => { 
    $httpBackend 
     .when('GET', '/clubs/fetch/ClubFoo') 
     .respond(200, {_id:'1', clubName: 'ClubFoo', owner: '[email protected]'}) 

    const newClub = { 
     clubName: 'ClubFoo', 
     owner: '[email protected]', 
    } 

    dataService.createClub(newClub).then(data => { 
     response = data 
    }) 

    $httpBackend.flush() 
    // expect(fn).to.throw('The Club Name you have entered already exists') 
    // ignore the expect for now, I have changed the code for Stack Overflow 
    }) 
}) 

console.log(existingClub) всегда undefined console.log(validationResult) всегда {result: true}

Что я делаю неправильно? Я ожидаю, что первый будет {_id:'1', clubName: 'ClubFoo', owner: '[email protected]'}, а последний будет {result: false, reason: 'Club already exists. Choose another Club Name'}

+0

$ http.get возвращает обещание, не так ли ?. Вероятно, он еще не разрешен - когда yoo делает маленький console.log. – madflow

+0

есть. Но это было бы разрешено, если бы я сделал console.log внутри 'then' ... правильно? Я попробовал это. – Rodders

+0

Чтобы разрешить обещание, которое вы создаете, вы должны ввести область/или (корнеплод) в свой тестовый пример и запустить следующий цикл дайджеста с областью. $ Digest() –

ответ

0

Это вопрос времени. ваш запрос $http не будет разрешен немедленно. (то есть existingClub: undefined и validateClub всегда return {result: true}).

function validateClub(club) { 
    let existingClub 

    // make fn return promise 
    return $http.get('/clubs/fetch/' + club.clubName).then(data => { 
    // update existingClub info when $http req resolved 
    existingClub = data 
    console.log(existingClub) 

    if(existingClub) return {result: false, reason: '...'} 
    return {result: true} 
    }, err => { 
    $log.error(err) 
    }) 
} 

также должны createClub возвращения обещание для dataService.createClub(newClub).then(...)

function createClub(club) { 
    return validateClub(club).then(validationResult => { 
    console.log(validationResult) 
    if (validationResult.result === false) { 
     throw new Error('The Club you entered has failed validation reason: ' + validationResult.reason) 
    } 
    // ... 

    }) 
}