2013-11-09 2 views
1

У меня возникла проблема: после того, как по крайней мере 8 часов поиска и возиться и спуститься с пустыми руками, вам нужна помощь сообщества. Есть статьи, которые пытаются решить аналогичные проблемы, но примеры отсутствуют и дают небольшую помощь, но не полностью. После прочтения я придумал следующие модули и тесты, которые я не смог определить для бэкэнда $ для фабрики ngWeather. Всякий раз, когда я пытаюсь использовать .flush(), я получаю ошибку без ожидающего запроса. Хотя это проблема, я также не уверен, что URL-адрес, переданный в запрос JSONP, издевается правильно. Будем очень благодарны за любые указания или указания.

Here is a link to the plunker

/* Модуль и контроллер JS */

var app = angular.module('test', []); 

app.controller('MainCtrl', function ($scope, ngWeather) { 
    ngWeather.getWeather(139,35).then(function(data) { 
     $scope.data = data.data; 
    }); 
}); 


app.factory('ngWeather', function ($http) { 
    return { 
     getWeather : function (lat, lon, callback) { 
      $http.jsonp('http://api.openweathermap.org/data/2.5/weather?lat=' + lat + '&lon=' + lon + '&callback=JSON_CALLBACK') 
      .then(function(data) { 
       callback({ 
        data : data.data, 
        city : data.data.name, 
        temp : Math.floor(data.data.main.temp*(9/5)-459.67), 
        minTemp : Math.floor(data.data.main.temp_min*(9/5)-459.67), 
        maxTemp : Math.floor(data.data.main.temp_max*(9/5)-459.67), 
        humidity : data.data.main.humidity, 
        currentCondition : data.data.weather[0].main, 
        currentDescription : data.data.weather[0].description, 
        icon : data.data.weather[0].icon 
       }); 
      }); 
     } 
    }; 
}); 

/* Тесты */

describe('Test: ngWeather', function() { 

    var ngWeather = jasmine.createSpyObj('ngWeather', ['getWeather']); 
    var $httpBackend; 
    beforeEach(module('test')); 
    beforeEach(inject(function(_$httpBackend_) { 
    $httpBackend = _$httpBackend_; 
    $httpBackend.when('jsonp', '*/api.openweathermap.org/*') 
     .respond({ 
     data : {"coord":{"lon":0,"lat":0},"sys":{"message":0.0472,"country":"US","sunrise":1383998825,"sunset":1384035744},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}],"base":"gdps stations","main":{"temp":289.68,"humidity":35,"pressure":958,"temp_min":276.48,"temp_max":301.48},"wind":{"speed":4.11,"gust":5.65,"deg":169},"clouds":{"all":92},"dt":1384022616,"id":4291884,"name":"Flatwoods","cod":200}, 
     city : 'Flatwoods', 
     temp : 63, 
     minTemp : 55, 
     maxTemp : 68, 
     humidity : 70, 
     currentCondition : 'Clouds', 
     currentDescription : 'Overcast clouds', 
     icon : '04n' 
     }); 
    })); 

    it('should check if getWeather method is defined', function() { 
    expect(ngWeather.getWeather).toBeDefined(); 
    }); 

    it('should check if a value is returned', function() { 
    ngWeather.getWeather(139,35,function(data) { 
     expect(data).not.toBe(null); 
    }); 
    }); 

    it('should check if a Flatwoods is returned as city', function() { 
    ngWeather.getWeather(139,35, function(data) { 
     expect(data.city).toEqual('Flatwoods'); 
    }); 
    }); 

    it('should make a call to the api', function() { 
    $httpBackend.expect('jsonp', '*/api.openweathermap.org/*') 
     .respond({ 
     data : {"coord":{"lon":0,"lat":0},"sys":{"message":0.0472,"country":"US","sunrise":1383998825,"sunset":1384035744},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}],"base":"gdps stations","main":{"temp":289.68,"humidity":35,"pressure":958,"temp_min":276.48,"temp_max":301.48},"wind":{"speed":4.11,"gust":5.65,"deg":169},"clouds":{"all":92},"dt":1384022616,"id":4291884,"name":"Flatwoods","cod":200}, 
     city : 'Flatwoods', 
     temp : 63, 
     minTemp : 55, 
     maxTemp : 68, 
     humidity : 70, 
     currentCondition : 'Clouds', 
     currentDescription : 'Overcast clouds', 
     icon : '04n' 
     }); 

    $httpBackend.flush(); 

    ngWeather.getWeather(139,35, function(data) { 
     expect(data.temp).toEqual('63'); 
    }); 


    }); 
}); 

Это мой первый идти на написание тестов, но я хотел бы чтобы продвигать качественный код, и я чувствую, что это важно. Опять же любая помощь или направление больш было бы оценено, Here is a link to the plunker

ответ

0

plnkr, что вы поделились фактически не вызовом функции getWeather во время испытаний и, следовательно, ваши тестовые случаи не выполнения expect в обратных вызовов на всех. Поэтому вы получали «Нет ожидающего запроса на сброс». Вы должны быть в состоянии проверить это, добавив какие-либо записи ведения журнала. У меня есть forked и изменен ваш plnkr here, чтобы иметь возможность запускать тесты с вашими макетными данными. Данные, которые вы издевались, имели разную структуру, чем ожидал ваш код. Теперь вы должны увидеть, что он работает here.

+0

Ahh Я вижу, большое спасибо. Где это мой первый тест, мне действительно нужен знакомый визуал, чтобы понять, как насмехаться и внедрять. Вы предоставили это. Ваша помощь очень ценится. –

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