То, с чем я сталкиваюсь, похоже на большинство людей, имеющих проблемы с вышеуказанной проблемой.В одном потоке, который я посмотрел, решение было довольно простым: использовать тот же экземпляр контекста, добавить и утвердить и поместить SUT под зонтик.Примерно так:
//Act
using (var actContext = new ItsAllAboutTheGameDbContext(contextOptions))
{
await actContext.Users.AddAsync(user);
await actContext.Wallets.AddAsync(userWallet);
await actContext.CreditCards.AddAsync(creditCard);
await actContext.SaveChangesAsync();
var sut = new TransactionService(actContext, walletServiceMock.Object,
userServiceMock.Object, foreignExchangeServiceMock.Object, cardServiceMock.Object, dateTimeProvider);
var transactionDTO = await sut.MakeDeposit(user, creditCard.Id, amount);
Assert.IsInstanceOfType(transactionDTO, typeof(TransactionDTO));
}
Что ж, это не дает мне хорошего ответа, потому что это обычно не так, поскольку мы используем одинаковые параметры контекста для всех экземпляров, как здесь:
//Act
using (var actContext = new ItsAllAboutTheGameDbContext(contextOptions))
{
await actContext.Users.AddAsync(user);
await actContext.Wallets.AddAsync(userWallet);
await actContext.CreditCards.AddAsync(creditCard);
await actContext.SaveChangesAsync();
}
//Assert
using (var assertContext = new ItsAllAboutTheGameDbContext(contextOptions))
{
var sut = new TransactionService(assertContext, walletServiceMock.Object,
userServiceMock.Object, foreignExchangeServiceMock.Object, cardServiceMock.Object, dateTimeProvider);
assertContext.CreditCards.Update(creditCard);
var transactionDTO = await sut.MakeDeposit(user, creditCard.Id, amount);
Assert.IsInstanceOfType(transactionDTO, typeof(TransactionDTO));
}
Но это не работает!Выкидывает вышеупомянутое в теме исключение!Сущность добавляется 2 раза (да, копия того же самого).Единственное странное решение, с которым я столкнулся только сейчас, - это обновить сущность (CreditCard), прежде чем переходить к тестируемой системе.Примерно так:
assertContext.CreditCards.Update(creditCard);
var transactionDTO = await sut.MakeDeposit(user, creditCard.Id, amount);
Благодаря обновлению, каким-то образом отслеживание помогает, я полагаю.То, что мне нужно прочитать больше документации по Entity Framework или другим фреймворкам, это одно, может кто-нибудь дать мне довольно простой ответ на вопрос, почему в обоих случаях это работает, какой из них предпочтителен, если какой-либо из них на самом деле, и если естьрешение для исключения без выполнения одного из обоих, что бы это было?Заранее спасибо!
Обновление
Я заметил, что когда я даже начинаю каким-либо образом отслеживать объект, например, присоединяю его, так как не хочу, чтобы он былмодифицировано любым нежелательным образом, это работает!Итак, я думаю, что поскольку Update отслеживает одним способом заданную сущность, а Attach - другим, я думаю, что сущность не отслеживалась с самого начала.Несмотря на то, что TrackBehaviour для всех должно быть установлено в true ... Мне действительно нужно некоторое подтверждение, чтобы мы могли либо закрыть эту ветку, либо пометить мой ответ как true