-
-
Notifications
You must be signed in to change notification settings - Fork 79
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Not suported with EF7: ExecuteDeleteAsync and ExecuteUpdateAsync #66
Comments
Is there a suggested approach on how to support this? |
My project uses UnitOfWork / GenericRepository pattern So instead of using native EF's ExecuteUpdateAsync / ExecuteDeleteAsync extensions I use own methods at the Generic Repository: public class GenericRepository<TEntity> : IRepository<TEntity>
where TEntity : class, new()
{
public GenericRepository(DbContext dbContext)
{
ArgumentNullException.ThrowIfNull(dbContext);
DbSet = dbContext.Set<TEntity>();
}
protected DbSet<TEntity> DbSet { get; }
...
public virtual Task<int> ExecuteUpdateAsync(
Expression<Func<TEntity, bool>> predicate,
Expression<Func<SetPropertyCalls<TEntity>, SetPropertyCalls<TEntity>>> setPropertyCalls,
CancellationToken cancellationToken = default)
=> DbSet
.AsQueryable()
.Where(predicate)
.ExecuteUpdateAsync(setPropertyCalls, cancellationToken);
public virtual Task<int> ExecuteDeleteAsync(
Expression<Func<TEntity, bool>> predicate,
CancellationToken cancellationToken = default)
=> DbSet
.AsQueryable()
.Where(predicate)
.ExecuteDeleteAsync(cancellationToken);
} In code instead of await _unitOfWork
.GetRepository<User>()
.AsQueryable()
.Where(user => user.Id == id)
.ExecuteDeleteAsync(); // Native Entity Framework extension I use my own methods: await _unitOfWork
.GetRepository<User>()
.ExecuteDeleteAsync(user => user.Id == id); // My method in GenericRepository Since they are no more extensions, I can easily mock them |
Hi, guys! Any update on this? I don't use the UoW / repository and it would be really interesting if MockQueryable could support these methods. |
same here... |
Hello. Thanks for you contribution. Sorry for the late answer. Unfortunately I'm very busy at the moment. If you provide a pull request with fix of the issue I would be happy to include it to the next release. Please don't forget to cover the case by additional tests to minimize possibility of regressions for the future. Thanks for the understanding. |
@SerhiyBalan |
Hello everyone. @lazaro-ansaldi made a great contribution for the issue in his pull request. Thanks @lazaro-ansaldi for that! |
Thank you, Roman. I recently made a comment to the PR here and want to know if my assumption of how the mocked I expected the underlying data to be updated. For example, given a mocked If that's the wrong assumption, is there a way to update the underlying data when Thank you. |
Thanks @romantitov & @lazaro-ansaldi . This worked for me with testing ExecuteUpdateAsync()! |
Big thanks to @romantitov and @lazaro-ansaldi. I also used the new feature for testing ExecuteUpdateAsync |
Hello!
I've been using MockQueryable with .NET6 a lot
Recently my project migrated to .NET 7 (EF Core 7)
And I started to use new EF7 features:
ExecuteDeleteAsync implementation is here
https://github.com/dotnet/efcore/blob/main/src/EFCore.Relational/Extensions/RelationalQueryableExtensions.cs#L316
ExecuteUpdateAsync implementation is here
https://github.com/dotnet/efcore/blob/main/src/EFCore.Relational/Extensions/RelationalQueryableExtensions.cs#L372
I use MockQueryable using a standard pattern:
ToListAsync(), FirstOrDefaultAsync() and others works perfectly with this pattern.
Unfortunately ExecuteUpdateAsync / ExecuteDeleteAsync doesn't work at all :(
When I try to run a unit test, a mocked
GetQueryable
method works nicely as usual, but it throws an exception on ExecuteDeleteAsyncException throws here on
.Invoke(this, new object[] { expression });
https://github.com/romantitov/MockQueryable/blob/master/src/MockQueryable/MockQueryable.EntityFrameworkCore/TestQueryProviderEfCore.cs#L25
Same exception throws at ExecuteUpdateAsync (but it says
There is no method 'ExecuteUpdate' on type 'Microsoft.EntityFrameworkCore.RelationalQueryableExtensions' that matches the specified arguments
)The
custom logic
pattern doesn't work because ExecuteUpdateAsync / ExecuteDeleteAsync are IQueryable extensionsThank you very much
The text was updated successfully, but these errors were encountered: