【问题标题】:DotNet Core Xunit Always Went to CatchblockDotNet Core Xunit 总是去 Catchblock
【发布时间】:2018-12-11 17:43:32
【问题描述】:

当我通过邮递员调用 api 时,数据成功插入 mongodb。但我正在运行 xunit 测试类,它显示 mongodb 空异常。为什么我会遇到这个问题。以下是我的测试类和项目源码。

XUnit

    [Fact]
    public async void Test1()
    {
        JObject jObject = new JObject();
        jObject.Add("name", "Satheesh");
        jObject.Add("email", "sat@sat.com");

        JObject finaljObject = new JObject();
        finaljObject.Add("data", jObject);

        Console.WriteLine("************ "+finaljObject);
        var content = JsonConvert.SerializeObject(finaljObject);
        var stringContent = new StringContent(content, Encoding.UTF8, "application/json");

        // Act
        var response = await _client.PostAsync("/api/Values/User", stringContent);

        // Assert
        var result = await response.Content.ReadAsStringAsync();
        var responseString = await response.Content.ReadAsStringAsync();
        Assert.Contains("Data Successfully Retrived", responseString);
    }

项目来源

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IMongoDatabase _database = null;
        // GET api/values


        public ValuesController(IOptions<Settings> settings)
        {
            try
            {
                var client = new MongoClient(settings.Value.ConnectionString);
                if (client != null)
                    _database = client.GetDatabase(settings.Value.Database);
            }
            catch(MongoException e)
            {
                Console.WriteLine("DB Connection Error "+e.StackTrace);
            }
        }


        [HttpPost]
        [Route("User")]
        public async Task <dynamic> RegisterUser([FromBody] JObject value)
        {
            //User Registeration
            BsonDocument ReturnData = new BsonDocument();
            try
            {
                dynamic jObject = JObject.FromObject(value);
                dynamic data = jObject.data;
                BsonDocument Document = BsonDocument.Parse(data.ToString());
                _database.GetCollection<BsonDocument>("User").InsertOne(Document);
                if(Document["_id"].AsObjectId != null)
                {                    
                    return ReturnData.Add("message","Successfully Inserted").Add("Success",1).Add("data",Document["_id"].AsObjectId).ToJson();
                }
                else
                {
                    return ReturnData.Add("message","Error During Insert Document").Add("Success",0).ToJson();
                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e.StackTrace);
                return ReturnData.Add("message","Error").Add("Success",e.StackTrace).ToJson();
            }
        }
   }

错误:

 DB Connection Error    at MongoDB.Driver.Core.Misc.Ensure.IsNotNull[T](T value, String paramName)
   at MongoDB.Driver.Core.Configuration.ConnectionString..ctor(String connectionString)
   at MongoDB.Driver.MongoUrlBuilder.Parse(String url)
   at MongoDB.Driver.MongoUrl..ctor(String url)
   at MongoDB.Driver.MongoClient..ctor(String connectionString)
   at test3.Controllers.ValuesController..ctor(IOptions`1 settings)

如何解决这个问题。任何人都想帮助我。

谢谢...

【问题讨论】:

  • 创建TestServer时如何初始化Settings选项?我猜原因是您正在创建一个没有正确配置设置的 TestServer。
  • 我就是这样做的 .private readonly HttpClient _client;公共 UnitTest1() { _server = new TestServer(new WebHostBuilder() .UseStartup()); _client = _server.CreateClient(); }
  • 当我调试代码时,值不是从 appsettings 文件中获取的
  • 我不太确定,但我现在正在测试您的代码,我猜原因是您正在从 appsetting.json 配置 Settings 选项,但启动失败了t 加载它,因为您的项目根目录已更改为测试项目。
  • 你能告诉任何解决方案吗

标签: c# asp.net-core .net-core asp.net-core-mvc xunit


【解决方案1】:

我猜原因是您的Test Project 没有配置Settings 选项。

在您的主项目的Startup(我们称之为App Project)中,您可以通过以下方式配置选项:

services.Configure<Settings>(Configuration) 

Startup 本身不会加载 appsettings.jsonHostBuilder 加载它并将Configuration 注入到Startup 中。

让我们回顾一下您的测试项目:

private readonly HttpClient _client; 
public UnitTest1() { 
    _server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
    _client = _server.CreateClient(); 
}

Test 项目根本没有为TestServer 设置Configuration

要修复此错误,您需要在您的测试项目中为您的WebHostBuilder 构建Configuration

    var configuration = new ConfigurationBuilder()
         // ... load the config file manually  
         //   , or copy your appsettings.json file to the test project
         //   , and custom it as you like
        .SetBasePath("path/to/your/App/proj")    
        .AddJsonFile("appsettings.json")
        .Build();

    var builder = new WebHostBuilder()
        .UseConfiguration(configuration)
        .UseStartup<App.Startup>();

    var server = new TestServer(builder);
    _client = server.CreateClient(); 

【讨论】:

  • 在构造函数部分我收到错误异常发生:CLR/System.ArgumentException Microsoft.Extensions.FileProviders.Physical.dll 中发生“System.ArgumentException”类型的异常,但未在其中处理用户代码:'路径必须是绝对的。'在 Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters) 在 Microsoft.Extensions.Configuration.FileConfigurationExtensions.SetBasePath(IConfigurationBuilder builder, String basePath) 在 test3.Tests.UnitTest1..ctor()
  • @SATHEESHP BasePath 必须是绝对路径。
  • @SATHEESHP 顺便说一下,如果成功创建新记录,您的操作方法将返回 "Successfully Inserted",但您的测试断言 Assert.Contains("Data Successfully Retrived", responseString);。您还需要在运行测试之前修复该错字。
猜你喜欢
  • 2020-08-29
  • 1970-01-01
  • 2017-10-16
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多