7

Tôi đang theo dõi guide này. Tôi có một Startup trong dự án API sử dụng tệp cấu hình appsettings.json.AppSettings.json để kiểm tra tích hợp trong ASP.NET Core

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)     
      .AddEnvironmentVariables(); 
     Configuration = builder.Build(); 

     Log.Logger = new LoggerConfiguration() 
      .Enrich.FromLogContext() 
      .ReadFrom.Configuration(Configuration) 
      .CreateLogger(); 
    } 

Phần cụ thể mà tôi đang xem là env.ContentRootPath. Tôi đã làm một số đào xung quanh và có vẻ như của tôi appsettings.json không thực sự được sao chép vào thư mục bin nhưng điều đó là tốt như ContentRootPath đang trở về MySolution\src\MyProject.Api\, là nơi tệp appsettings.json được đặt.

Vì vậy, trong dự án thử nghiệm tích hợp của tôi, tôi có thử nghiệm này:

public class TestShould 
{ 
    private readonly TestServer _server; 
    private readonly HttpClient _client; 

    public TestShould() 
    { 
     _server = new TestServer(new WebHostBuilder().UseStartup<Startup>()); 
     _client = _server.CreateClient(); 
    } 

    [Fact] 
    public async Task ReturnSuccessful() 
    { 
     var response = await _client.GetAsync("/monitoring/test"); 
     response.EnsureSuccessStatusCode(); 

     var responseString = await response.Content.ReadAsStringAsync(); 

     Assert.Equal("Successful", responseString); 
    } 

này về cơ bản là sao chép và dán từ hướng dẫn. Khi tôi gỡ lỗi thử nghiệm này, ContentRootPath thực sự là MySolution\src\MyProject.IntegrationTests\bin\Debug\net461\, rõ ràng là thư mục đầu ra xây dựng cho dự án thử nghiệm và một lần nữa tệp appsettings.json không có (có tôi có một tệp appsettings.json khác trong dự án thử nghiệm) để thử nghiệm không thành công số TestServer.

Tôi đã cố gắng giải quyết vấn đề này bằng cách sửa đổi tệp thử nghiệm project.json.

"buildOptions": { 
    "emitEntryPoint": true, 
    "copyToOutput": { 
     "includeFiles": [ 
      "appsettings.json" 
     ] 
    } 
} 

Tôi hy vọng điều này sẽ sao chép các tập tin vào thư mục appsettings.json xây dựng đầu ra nhưng nó than phiền về các dự án thiếu một phương pháp Main cho một điểm nhập cảnh, xử lý các dự án thử nghiệm giống như một dự án console.

Tôi có thể làm gì để giải quyết vấn đề này? Tôi có làm điều gì sai?

Trả lời

4

Cuối cùng, tôi đã theo dõi số guide này, cụ thể là phần Kiểm tra tích hợp ở phía dưới cùng của trang. Điều này loại bỏ sự cần thiết phải sao chép các tập tin appsettings.json vào thư mục đầu ra. Thay vào đó nó sẽ cho dự án thử nghiệm biết thư mục thực sự của ứng dụng web.

Để sao chép appsettings.json vào thư mục đầu ra, tôi cũng đã quản lý để làm việc đó. Kết hợp với câu trả lời từ dudu, tôi sử dụng include thay vì includeFiles nên phần kết quả sẽ giống như thế này:

"buildOptions": { 
    "copyToOutput": { 
     "include": "appsettings.json" 
    } 
} 

Tôi không hoàn toàn chắc chắn lý do tại sao các công trình này nhưng nó. Tôi đã xem nhanh tài liệu nhưng không thể tìm thấy bất kỳ khác biệt thực sự nào và vì vấn đề ban đầu đã được giải quyết về cơ bản, tôi không nhìn xa hơn.

+0

Từ hiểu biết của tôi: trong khi kiểm tra, khi bạn sử dụng root ứng dụng đích làm đường dẫn gốc và/hoặc đường dẫn cơ sở (thay vì thư mục kết quả thử nghiệm), ứng dụng của bạn 'Startup' sẽ sử dụng' appsettings.json' của riêng nó, như khi chạy ngoài kiểm tra. Trong trường hợp như vậy, việc sao chép dự án thử nghiệm 'appsettings.json' vào thư mục đầu ra của nó sẽ không có hiệu lực. Tập tin json đó sẽ không được đọc chút nào. Đó có phải là trải nghiệm của bạn không? – superjos

0

Xóa "emitEntryPoint": true trong thử nghiệm project.json tệp.

+0

Điều đó đã loại bỏ lỗi về việc thiếu một 'Main' nhưng nó không sao chép' appsettings.json' vào thư mục 'bin'. –

Các vấn đề liên quan