2014-06-06 2 views
3

다트, 단원 테스트 및 일반적인 비동기 프로그래밍 입문. 그리고 StackOverflow, 그 문제에 대해. shelf_route 주위에 RESTful 서버를 구축하고 HttpClient를 사용하여 테스트하려고합니다.HttpClient 및 unittest

내 테스트는 작동하지만 스스로 종료하지 않습니다. 대신 수동으로 프로세스를 종료해야합니다. 나는 온라인에서 찾은 여러 접근법을 시도했지만 운이 없다. 누구든지 내게 손을 줄 수 있습니까? 여기에 내가 함께 일하고 있어요 무엇 :

import 'dart:io'; 
import 'package:unittest/unittest.dart'; 
import 'package:shelf/shelf.dart' as shelf; 
import 'package:shelf/shelf_io.dart' as io; 
import 'package:toner_track/handlers.dart'; 
import 'package:toner_track/config.dart'; 

void main() { 
    var server; 

    group('Server tests',() { 
    var server; 

    setUp(() { 
     var handler = const shelf.Pipeline().addHandler(router); 
     io.serve(handler, HOST, PORT).then((s) { 
      server = s; 
     }); 
    }); 

    tearDown(() { 
     server.close(); 
    }); 

    test('Invalid URL returns 404',() { 
     new HttpClient().getUrl(Uri.parse('http://$HOST:$PORT')) 
     .then((HttpClientRequest request) => request.close()) 
     .then(expectAsync((HttpClientResponse response) { 
      expect(response.statusCode, equals(404)); 
     })); 
    }); 

    test('GET /printers returns 200',() { 
     new HttpClient().getUrl(Uri.parse('http://$HOST:$PORT$rootPrintersPath')) 
     .then((HttpClientRequest request) => request.close()) 
     .then(expectAsync((HttpClientResponse response) { 
     expect(response.statusCode, equals(200)); 
     })); 
    }); 

    test('POST /printers returns 201',() { 
     new HttpClient().postUrl(Uri.parse('http://$HOST:$PORT$rootPrintersPath')) 
     .then((HttpClientRequest request) { 
      request.write('{"foo": 42}'); 
      return request.close(); 
     }) 
     .then(expectAsync((HttpClientResponse response) { 
      expect(response.statusCode, equals(201)); 
     })); 
    }); 
    }); 
} 

UPDATE :http 패키지에 찬성 HttpClient를 포기하기로 결정했다. 훨씬 더 쉽게 작업 할 수 있으며, 이제는 자체 테스트가 종료됩니다. 분명히 나는 ​​처음으로 돌아 다니는 곳에서 올바르게 처리하지 못했습니다.

import 'dart:io'; 
import 'package:http/http.dart' as http; 
import 'package:unittest/unittest.dart'; 
import 'package:shelf/shelf.dart' as shelf; 
import 'package:shelf/shelf_io.dart' as io; 
import 'package:toner_track/handlers.dart'; 
import 'package:toner_track/config.dart'; 

void main() { 
    group('Server tests',() { 
    var server; 

    setUp(() { 
     var handler = const shelf.Pipeline().addHandler(router); 
     return io.serve(handler, HOST, PORT).then((s) { 
     server = s; 
     }); 
    }); 

    tearDown(() { 
     server.close(); 
    }); 

    test('Invalid URL returns 404',() { 
     http.get('http://$HOST:$PORT').then(expectAsync((response) { 
     expect(response.statusCode, equals(404)); 
     })); 
    }); 

    test('GET /printers returns 200',() { 
     http.get('http://$HOST:$PORT$rootPrintersPath').then(expectAsync((response) { 
     expect(response.statusCode, equals(200)); 
     })); 
    }); 

    test('POST /printers returns 201',() { 
     http.post('http://$HOST:$PORT$rootPrintersPath', body: {"foo": "42"}).then(expectAsync((response) { 
      expect(response.statusCode, equals(201)); 
     })); 
    }); 
    }); 
} 
+0

실행이'expect' 행에 도달하고 실행합니까? 출력물을 얻었습니까? –

+0

@ GünterZöchbauer 예,'expect' 문이 평가됩니다. 이것은 중요한 것입니다. 그러나이 프로그램은 모든 테스트가 실행 된 후에도 계속 실행됩니다. 수동으로 프로세스를 종료해야합니다. – mgoodness

+0

@ GünterZöchbauer 당신은 [여기] (http://stackoverflow.com/a/23987275/3029658)를 통해 간접적으로 도움을주었습니다. – mgoodness

답변

3

그것은이처럼 보이지 않는이 문제의 원인이지만 setUp에서 비동기 작업을 시작하면 당신은 미래를 반환해야 다음은 위의 코드는 지금의 모습입니다.

return io.serve(handler, HOST, PORT).then((s) { 
     server = s; 

단위 테스트 프레임 워크는 테스트를 실행 시작하기 전에 미래가 반환을 기다립니다.

나는 테스트가 똑같이해야한다고 생각한다. 지금까지 내가 테스트 한 비동기 작업이 시작되었지만 과 같이 작동하지 않았을 때 Future를 반환하는 것으로 충분하다는 공개 버그가 있음을 기억합니다. 이것은 얼마 전 이었지만, 나는 이것이 고정되어 있다고 가정합니다.

test('Invalid URL returns 404',() { 
    return new HttpClient().getUrl(Uri.parse('http://$HOST:$PORT')) 
    .then((HttpClientRequest request) => request.close()) 
    .then(expectAsync((HttpClientResponse response) { 
     expect(response.statusCode, equals(404)); 
    })); 
}); 

이 main 함수의 시작 부분에 다음을 추가

test('POST/... 


test('Invalid URL returns 404',() { 
    var cb = new expectAsync((){}); 

    new HttpClient().getUrl(Uri.parse('http://$HOST:$PORT')) 
    .then((HttpClientRequest request) => request.close()) 
    .then(expectAsync((HttpClientResponse response) { 
     expect(response.statusCode, equals(404)); 
     cb(); // <== to notify the unit test framework that the async operation is finished 
    })); 
}); 
+0

setUp 관련 팁을 보내 주셔서 감사합니다. 불행히도, 다른 제안들 중 어느 것도 내 끊임없는 테스트를 해결하지 못합니다. – mgoodness

+0

방금 ​​테스트에서'expectAsync'를 이미 보았지만 제가했던 것보다 조금 다른 것을 사용했습니다. –

0

작동하지 않는 경우) ( useGoogle3VMConfiguration;

+0

잘못된 질문이 있으십니까? – mgoodness