2014-06-06 50 views
3

通用的新功能Dart,單元測試和異步編程。和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:決定放棄的HttpClient有利於http包。更容易處理,我的測試現在終止。顯然,我在第一次復飛時沒有正確處理一些事情。下面是上面的代碼看起來像現在:

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是的,「預期」陳述被評估,這是重要的事情。但是,即使在所有測試運行(並通過)之後,該程序仍會繼續運行。我必須手動終止該過程。 – mgoodness

+0

@GünterZöchbauer你最終通過[here](http://stackoverflow.com/a/23987275/3029658)間接幫助。 – mgoodness

回答

3

它看起來並不像這是你的問題的原因,但如果你在setUp啓動異步操作,你應該回到未來。

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

的單元測試框架等待將來回到它開始運行測試之前。

我認爲測試應該做同樣的事情。據我記得有一個開放的bug,對於測試本身來說,當異步操作開始時它應該足以返回Future,但它在setUp中不起作用。這是前一陣子,所以我認爲這是固定的。

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)); 
    })); 
}); 

如果這不起作用

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