unit testing - C# How to Moq entityframework DbSet Add method -
i trying create test test entity framework add
method. can how mock dbset.add
method. have tried below not working. doing wrong?
the result getting null
after repository.insert
...
test.cs:
var producttocreate = new product { name = "added", description = "added" }; var result = repository.insertasync(objtocreate, usercontext).result; assert.areequal(result.name, "added");
mock.cs
internal static dbset<t> getmockeddataset<t>(ienumerable<t> data) t : class { // create mocked data set contains data var set = new mock<dbset<t>>(); set.as<idbasyncenumerable<t>>() .setup(m => m.getasyncenumerator()) .returns(new testdbasyncenumerator<t>(data.getenumerator())); set.as<iqueryable<t>>() .setup(m => m.provider) .returns(new testdbasyncqueryprovider<t>(data.asqueryable().provider)); set.as<iqueryable<t>>().setup(m => m.expression).returns(data.asqueryable().expression); set.as<iqueryable<t>>().setup(m => m.elementtype).returns(data.asqueryable().elementtype); set.as<iqueryable<t>>().setup(m => m.getenumerator()).returns(data.getenumerator()); set.setup(x => x.asnotracking()).returns(set.object); set.setup(x => x.add(it.isany<t>())).callback<t>((s) => data.concat(new[] { s })); // return mock return set.object; }
repository:
public async task<product> insertasync(product input) { using (var ctx = .....)) { var added = ctx.set<product>().add(input); await ctx.validateandsaveasync(); return added; } }
according how add
method being used in method under test...
var added = ctx.set<product>().add(input);
...there should returns
in setup returns argument entered, if desired functionality.
set.setup(x => x.add(it.isany<t>())) .returns<t>(arg => arg) .callback<t>((s) => data.concat(new[] { s }));
but given information context dependency unknown...
using (var ctx = .....))
it uncertain if provided solution have desired effect.
additionally if testing async method, don't mix async , sync calls. following line...
var result = repository.insertasync(objtocreate, usercontext).result;
...can cause deadlocks.
make test method async way.
[testmethod] public async task insertasync_should_return_product() { //...other code var expected = new product { name = "added", description = "added" }; var actual = await repository.insertasync(expected, usercontext); assert.areequal(expected.name, actual.name); }
Comments
Post a Comment