2013-07-01 3 views
2

Jasmine 및 RequireJS를 사용하여 테스트를 수행하려고합니다. 제가 설명했던 기능의 맥락에 문제가 있다는 것을 알기 전까지는 모든 것이 잘 진행되고있었습니다.Jasmine 비동기 테스트

저는 Ajax 테스트를하고 있습니다. 우선 내가하는 일은 성공을위한 리스너를 설정 한 다음 그 서비스를 요청하는 것입니다. 그런 다음 내 it() 선언 내에서 서비스 응답을 기반으로 테스트를 수행합니다. 여기

은 내 spec modules :

// auth.js 
define(['service/auth'], function(auth) { 
    describe('Tests "auth" service', function() { 
    var data; 
    var OPTIONS = { 
     CN: '147144147', 
     GV: '147153162' 
    }; 

    auth.on.success.addOnce(function(response) { 
     data = response; 
    }); 

    auth.request(OPTIONS); 

    it('"status" should exist and be "true"', function() { 
     waitsFor(function() { 
     return data !== undefined; 
     }); 

     runs(function() { 
     expect(data['status']).toBeDefined(); 
     expect(data['status']).toBeTruthy(); 
     }); 
    }); 

    }); 
}); 

// login.js 
define(['service/login'], function(login) { 
    describe('Tests "login" service', function() { 
    var data; 
    var OPTIONS = { 
     oper: 1, 
     codigoouemail: '101', 
     senha: '10151015' 
    }; 

    login.on.success.addOnce(function(response) { 
     data = response; 
    }); 

    login.request(OPTIONS); 

    it('Should get the service response for user "' + OPTIONS.codigoouemail + '"', function() { 
     waitsFor(function() { 
     return data !== undefined; 
     }); 

     runs(function() { 
     expect(data).toBeDefined(); 
     }); 
    }); 

    }); 
}); 

개별적으로 테스트하지만 내가 주목하는 것은 그들이 data에 대해 같은 값을 공유하는 때 그들은 모두 잘 작동합니다. 실행될 첫 번째 모듈은 값을 설정하고 다른 스펙은 동일한 값을 갖습니다. 각 서비스 응답을 제대로 테스트 할 수 있도록 모듈 당 하나의 값을 가져야합니다. 이론적으로 모든 모듈은 자체 범위를 가져야하지만 이런 일이 발생하지는 않습니다.

누군가이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

+0

[Jasmine 2.0.0] (http://jasmine.github.io/2.0/introduction.html)에는 이제'done' 매개 변수가 있습니다.()'메소드를 사용하면 코드를 조금 줄여서 비동기 테스트를 작성할 수 있습니다. 또한 [Karma test runner] (http://karma-runner.github.io/0.10/index.html)를 사용하는 경우 [Karma는 현재 Jasmine 1.3.1 번들과 함께 제공됩니다.] (http : //stackoverflow.com/a/21117832/456814), 그런 경우에는 새로운 "done"매개 변수를 사용할 수 없습니다 (적어도 Karma가 Jasmine 버전을 업데이트 할 때까지). –

+0

[Jasmine 2.0.0 비동기 Javascript 테스트] (http://blogs.lessthandot.com/index.php/webdev/uidevelopment/javascript/testing-asynchronous-javascript-w-jasmine/)는 좋은 블로그 게시물입니다. 사용 가능한 Jasmine 버전이 있다면 새로운 Jasmine 2.0.0'done' 매개 변수를 사용하는 방법. –

+0

@Cupcake 오, 마침내! 좋은 물건. 저는 현재 Konacha plus Sinon과 Chai로 테스트를 진행하고 있습니다. 나는 재스민에게 또 다른 기회를 주어야한다. –

답변

1

그래서 이것은 완전히 나빴습니다. 아약스 호출에서 오류가 발생하여 항상 동일한 값을 제공했기 때문에 모든 테스트가 실패했습니다. 어쨌든 도움을 주셔서 감사합니다 :)

+0

당신이 신비를 풀어 들으니 다행입니다. –

0

죄송합니다,하지만 문제는 데이터 변수에 없습니다. Javascript에는 기능 범위가 있으므로 두 데이터 변수가 다릅니다. 여기에 데이터를 표시하는 바이올린은 동일하지 않습니다이다 :

//--- SPECS ------------------------- 
describe('Tests timeout service 1', function() { 

     var data; 

     setTimeout(function(response) { 
      data = 3; 
     }, 1000); 


     it('Should be 3', function() { 

      waitsFor(function() { 
       return data !== undefined; 
      }); 

      runs(function() { 
       expect(data).toBe(3); 
      }); 

     }); 


     it('Should be 30', function() { 

      waitsFor(function() { 
       return data === 30; 
      }); 

      runs(function() { 
       expect(data).toBe(30); 
      }); 

     }); 

    }); 

describe('Tests timeout service 2', function() { 

     var data; 

     setTimeout(function(response) { 
      data = 30; 
     }, 2000); 


     it('Should be 30', function() { 

      waitsFor(function() { 
       return data !== undefined; 
      }); 

      runs(function() { 
       expect(data).toBe(30); 
      }); 

     }); 


     it('Should be 30', function() { 

      waitsFor(function() { 
       return data === 3; 
      }); 

      runs(function() { 
       expect(data).toBe(3); 
      }); 

     }); 

    }); 
+0

그래, 나는 그것을 안다. 나를 귀찮게하는 것은 RequireJS가 함수 범위 지정을 처리해야한다는 것입니다. 그래서 Jasmine이 함수 컨텍스트와 관련하여 비동기 코드를 잘 사용하지 않는 문제가 있다고 가정합니다. 나는 심지어 같은 문제를 가진 사람들을 발견했다 ... –

+0

이봐, 이제 네가 여기서 한 것을 볼 수있다. '데이터'는 정확히 내가 원하는 바 'describe()'에 따라 다른 값을 가지지 만, 나는 똑같은 결과를 얻는다. 'data' 값을 출력 할 때는 항상 첫 번째'response'의 값이됩니다. 이것은 나쁘고 성가신 일입니다 ... –

1

그래서 여기 내 VOs이 생성되는 경우 내가 확인하는 데 사용하는 비동기 테스트의 예 : 아래

http://jsfiddle.net/LNuHU/2/ 코드입니다

it('should return a list of item VOs', function() { 
    var dfd = $q.defer(); 
    var items = mock.content.items[1].items; 

    runs(function() { 
    dfd.promise.then(function(VOs) { 
     expect(VOs.length).toBe(items.length); 
     expect(A.equals(itemVO(items[0]), VOs[0])).toBe(true); 
    }, this.fail); 
    }); 

    waits(50); 

    runs(function() { 
    itemsVO(dfd, items); 

    $rootScope.$digest(); 
    }); 
}); 

그래서 먼저 비동기 함수가 완료되었을 때들을 수있는 함수를 실행합니다. 앱이 준비되었는지 50ms를 기다린 다음 비동기 함수를 실행합니다. expect이 콜백에있는 방법에 유의하십시오.

관련 문제