Ядро DotNet Xunit всегда уходило в Catchblock - PullRequest
0 голосов
/ 10 декабря 2018

Когда я вызываю API через почтальона, данные успешно вставлены в mongodb.Но я запускаю тестовый класс xunit, он показывает исключение mongodb null.Почему я получаю эту проблему.Ниже приводится мой тестовый класс и исходный код проекта.

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

Источник Projcet

    [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)

Как решить эту проблему.Любой, кто попытается мне помочь.

Спасибо ...

1 Ответ

0 голосов
/ 11 декабря 2018

Я думаю, причина в том, что Test Project не настраивает параметры Settings.

В вашем Startup вашего основного проекта (назовем его App Project) вы настраиваете параметрby:

services.Configure<Settings>(Configuration) 

Startup не загружает сам appsettings.json.HostBuilder загружает его и добавляет Configuration в Startup для вашего.

Давайте рассмотрим ваш тестовый проект:

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

Тестовый проект не установленна Configuration для TestServer на всех .

Чтобы исправить эту ошибку, вам нужно собрать Configuration для вашего WebHostBuilder в вашем тестовом проекте:

    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(); 
...