Как динамически выбирать метод конечной точки DbContext для APIC#

Место общения программистов C#
Ответить
Anonymous
 Как динамически выбирать метод конечной точки DbContext для API

Сообщение Anonymous »

Я разработал API, который использует вспомогательный класс для получения контекста базы данных для каждой функции конечной точки. Теперь я пытаюсь написать модульные тесты для каждой конечной точки и хочу использовать базу данных в памяти в своем проекте модульного тестирования.
Проблема, с которой я сталкиваюсь, заключается в том, что по порядку для вызова функций API мне пришлось добавить конструктор в класс контроллера API. Это позволило бы мне передать dbContext базы данных в памяти функции контроллера для ее использования. Однако после добавления конструктора при попытке достичь конечной точки возникла следующая ошибка:

"ExceptionMessage": "Невозможно разрешить службу для типа ' AppointmentAPI.Appt_Models.ApptSystemContext» при попытке активировать AppointmentAPI.Controllers.apptController».

ОБНОВЛЕНИЕ
controller.cs
public class apptController : Controller
{
private readonly ApptSystemContext _context;

public apptController(ApptSystemContext dbContext)
{
_context = dbContext;
}

#region assingAppt
/*
* assignAppt()
*
* Assigns newly created appointment to slot
* based on slotId
*
*/
[Authorize]
[HttpPost]
[Route("/appt/assignAppt")]
public string assignAppt([FromBody] dynamic apptData)
{
int id = apptData.SlotId;
string json = apptData.ApptJson;
DateTime timeStamp = DateTime.Now;

using (_context)
{
var slot = _context.AppointmentSlots.Single(s => s.SlotId == id);

// make sure there isn't already an appointment booked in appt slot
if (slot.Timestamp == null)
{
slot.ApptJson = json;
slot.Timestamp = timeStamp;

_context.SaveChanges();
return "Task Executed\n";
}
else
{
return "There is already an appointment booked for this slot.\n" +
"If this slot needs changing try updating it instead of assigning it.";
}
}
}
}

UnitTest.cs
using System;
using Xunit;
using AppointmentAPI.Controllers;
using AppointmentAPI.Appt_Models;
using Microsoft.EntityFrameworkCore;

namespace XUnitTest
{
public abstract class UnitTest1
{
protected UnitTest1(DbContextOptions contextOptions)
{
ContextOptions = contextOptions;

SeedInMemoryDB();
}

protected DbContextOptions ContextOptions { get; }

private void SeedInMemoryDB()
{
using(var context = new ApptSystemContext(ContextOptions))
{
context.Database.EnsureDeleted();
context.Database.EnsureCreated();

var seventh = new AppointmentSlots
{
SlotId = 7,
Date = Convert.ToDateTime("2020-05-19 00:00:00.000"),
Time = TimeSpan.Parse("08:45:00.0000000"),
ApptJson = null,
Timestamp = null
};

context.AppointmentSlots.Add(seventh);
context.SaveChanges();
}
}

[Fact]
public void Test1()
{
DbContextOptions options;
var builder = new DbContextOptionsBuilder();
builder.UseInMemoryDatabase();
options = builder.Options;

var context = new ApptSystemContext(options);

var controller = new apptController(context);

// Arrange
var request = new AppointmentAPI.Appt_Models.AppointmentSlots
{
SlotId = 7,
ApptJson = "{'fname':'Emily','lname':'Carlton','age':62,'caseWorker':'Brenda', 'appStatus':'unfinished'}",
Timestamp = Convert.ToDateTime("2020-06-25 09:34:00.000")
};

string expectedResult = "Task Executed\n";

// Act
var response = controller.assignAppt(request);

Assert.Equal(response, expectedResult);

}
}
}


InMemoryClass.cs
using System;
using System.Data.Common;
using Microsoft.EntityFrameworkCore;
using AppointmentAPI.Appt_Models;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace XUnitTest
{
public class InMemoryClass1 : UnitTest1, IDisposable
{
private readonly DbConnection _connection;

public InMemoryClass1()
:base(
new DbContextOptionsBuilder()
.UseSqlite(CreateInMemoryDB())
.Options
)
{
_connection = RelationalOptionsExtension.Extract(ContextOptions).Connection;
}

private static DbConnection CreateInMemoryDB()
{
var connection = new SqliteConnection("DataSource=:memory:");

connection.Open();

return connection;
}

public void Dispose() => _connection.Dispose();

}
}



Подробнее здесь: https://stackoverflow.com/questions/620 ... int-method
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»