Издевательский объект модульного тестирования для EF.PropertyC#

Место общения программистов C#
Ответить
Anonymous
 Издевательский объект модульного тестирования для EF.Property

Сообщение Anonymous »

У меня есть метод в универсальном классе, который использует дерево выражений для предоставления имени свойства, которое он должен использовать для сопоставления при запросе к базе данных существующих записей.

Код: Выделить всё

public virtual List GetExistingRecords(HashSet sourceKeys)
{
var propertyName = ((MemberExpression)KeySelector().Body).Member.Name;

return _targetDbContext.Set()
.Where(e => sourceKeys.Contains(EF.Property(e, propertyName)))
.ToList();
}
Вот выражение, реализованное в производном классе:

Код: Выделить всё

protected override Expression KeySelector() => accountEntity => accountEntity.AccountNumber;
Он работает хорошо, за исключением случаев, когда он высмеивает его в моих модульных тестах:

Код: Выделить всё

public class CustomerServiceTests
{
private readonly Mock _mockCustomerDbContext;
private readonly Mock _mockStagingDbContext;
private readonly Mock _mockMapper;
private readonly Core.Concrete.Domain.CustomerService _customerService;

public CustomerServiceTests()
{
_mockCustomerDbContext = new Mock();
_mockStagingDbContext = new Mock();
_mockMapper = new Mock();
_customerService = new Core.Concrete.Domain.CustomerService(_mockStagingDbContext.Object, _mockCustomerDbContext.Object, _mockMapper.Object);
}

[Fact]
public async Task MigrateAccounts_ShouldAddNewAccounts()
{
// Arrange
var sourceAccounts = CustomerTestData.GenerateAccounts(1);
var sourceAccountEntities = CustomerTestData.GenerateAccountEntities(1);
var existingAccounts = new List().AsQueryable();

_mockMapper.Setup(m => m.Map(It.IsAny())).Returns(sourceAccounts);
_mockMapper.Setup(m => m.Map(It.IsAny())).Returns(sourceAccountEntities);
_mockCustomerDbContext.Setup(db => db.Set()).ReturnsDbSet(existingAccounts);
_mockCustomerDbContext.Setup(db => db.Set().AddRangeAsync(It.IsAny(), It.IsAny())).Returns(Task.CompletedTask);
_mockCustomerDbContext.Setup(db => db.SaveChangesAsync(It.IsAny())).ReturnsAsync(1);

// Act
await _customerService.MigrateAccounts();

// Assert
_mockCustomerDbContext.Verify(db => db.Set().AddRangeAsync(It.Is(entities => entities.Count == 1), It.IsAny()), Times.Once);
_mockCustomerDbContext.Verify(db => db.Set().UpdateRange(It.IsAny()), Times.Never);
_mockCustomerDbContext.Verify(db => db.SaveChangesAsync(It.IsAny()), Times.Once);
}

[Fact]
public async Task MigrateAccounts_ShouldUpdateExistingAccounts()
{
// Arrange
var sourceAccounts = CustomerTestData.GenerateAccounts(1);
var existingAccounts = CustomerTestData.GenerateAccountEntities(1).AsQueryable();

_mockMapper.Setup(m => m.Map(It.IsAny())).Returns(sourceAccounts);
_mockCustomerDbContext.Setup(db => db.Set()).ReturnsDbSet(existingAccounts);
_mockCustomerDbContext.Setup(db => db.Set().UpdateRange(It.IsAny()));
_mockCustomerDbContext.Setup(db => db.SaveChangesAsync(It.IsAny())).ReturnsAsync(1);
_mockCustomerDbContext.Setup(db => db.ReplaceEntity(It.IsAny(), It.IsAny()));

// Act
await _customerService.MigrateAccounts();

// Assert
_mockCustomerDbContext.Verify(db => db.Set().AddRangeAsync(It.IsAny(), It.IsAny()), Times.Never);
_mockCustomerDbContext.Verify(db => db.Set().UpdateRange(It.Is(entities => entities.Count == 1)), Times.Once);
_mockCustomerDbContext.Verify(db => db.SaveChangesAsync(It.IsAny()), Times.Once);
_mockCustomerDbContext.Verify(db =>  db.ReplaceEntity(It.IsAny(), It.IsAny()), Times.Exactly(1));
}
Первый тест пройден, я предполагаю, потому что итерации не происходит, но для второго и третьего они оба терпят неудачу с System.InvalidOperationException : метод EF.Property может только использоваться в запросах Entity Framework LINQ. ошибка в вызове метода DBContext в GetExistingRecords.
Может ли кто-нибудь пролить свет на то, как мне следует настроить издевательство по-другому, чтобы исправить это?
Изменить: я добавил DotNetFiddle, чтобы показать ошибку с сокращенной версией структуры моего кода здесь - https://dotnetfiddle.net/CQTYc4

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

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

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

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

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

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