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

Popular posts from this blog

php - How to add and update images or image url in Volusion using Volusion API -

javascript - IE9 error '$'is not defined -