c# - Async methods return null -
if try mock type containing async method such :
interface foo { task<int> bar(); } then mock's bar method returning null. guess moq choosing default(task<int>) default return value method, indeed null. moq should rather choose task.fromresult(default(int)) default value. can force moq make async methods returning non-null tasks ?
if interested, made extension class makes async methods stubing less verbose :
public static class setupextensions { public static ireturnsresult<tmock> returnstask<tmock, tresult>( isetup<tmock, task<tresult>> setup) tmock : class { return setup.returns(() => task.fromresult(default(tresult))); } public static ireturnsresult<tmock> returnstask<tmock, tresult>( isetup<tmock, task<tresult>> setup, tresult value) tmock : class { return setup.returns(() => task.fromresult(value)); } public static ireturnsresult<tmock> returnstask<tmock, tresult>( isetup<tmock, task<tresult>> setup, func<tresult> func) tmock : class { return setup.returns(task.factory.startnew(func)); } public static ireturnsresult<tmock> returnstask<tmock, t, tresult>( isetup<tmock, task<tresult>> setup, func<t, tresult> func) tmock : class { return setup.returns<t>(arg => task.factory.startnew(() => func(arg))); } public static ireturnsresult<tmock> returnstask<tmock, t1, t2, tresult>( isetup<tmock, task<tresult>> setup, func<t1, t2, tresult> func) tmock : class { return setup.returns<t1, t2>((arg1, arg2) => task.factory.startnew(() => func(arg1, arg2))); } public static ireturnsresult<tmock> returnstask<tmock, t1, t2, t3, tresult>( isetup<tmock, task<tresult>> setup, func<t1, t2, t3, tresult> func) tmock : class { return setup.returns<t1, t2, t3>((arg1, arg2, arg3) => task.factory.startnew(() => func(arg1, arg2, arg3))); } public static ireturnsresult<tmock> returnstask<tmock, t1, t2, t3, t4, tresult>( isetup<tmock, task<tresult>> setup, func<t1, t2, t3, t4, tresult> func) tmock : class { return setup.returns<t1, t2, t3, t4>((arg1, arg2, arg3, arg4) => task.factory.startnew(() => func(arg1, arg2, arg3, arg4))); } public static ireturnsresult<tmock> returnstask<tmock>(this isetup<tmock, task> setup, action action) tmock : class { return setup.returns(task.factory.startnew(action)); } public static ireturnsresult<tmock> returnstask<tmock, t>(this isetup<tmock, task> setup, action<t> action) tmock : class { return setup.returns<t>(arg => task.factory.startnew(() => action(arg))); } public static ireturnsresult<tmock> returnstask<tmock, t1, t2>(this isetup<tmock, task> setup, action<t1, t2> action) tmock : class { return setup.returns<t1, t2>((arg1, arg2) => task.factory.startnew(() => action(arg1, arg2))); } public static ireturnsresult<tmock> returnstask<tmock, t1, t2, t3>(this isetup<tmock, task> setup, action<t1, t2, t3> action) tmock : class { return setup.returns<t1, t2, t3>((arg1, arg2, arg3) => task.factory.startnew(() => action(arg1, arg2, arg3))); } public static ireturnsresult<tmock> returnstask<tmock, t1, t2, t3, t4>(this isetup<tmock, task> setup, action<t1, t2, t3, t4> action) tmock : class { return setup.returns<t1, t2, t3, t4>((arg1, arg2, arg3, arg4) => task.factory.startnew(() => action(arg1, arg2, arg3, arg4))); } public static ireturnsresult<tmock> returnstask<tmock>(this isetup<tmock, task> setup) tmock : class { return setup.returns(task.factory.startnew(delegate { })); } } some examples :
//example 1 : public interface ifoo { task bar(); } var mock = new mock<ifoo>(); mock.setup(m => m.bar()).returnstask(); //await bar() return void //example 2 : public interface ifoo { task<int> bar(); } var mock = new mock<ifoo>(); mock.setup(m => m.bar()).returnstask(); //await bar() return default(int) //example 3 : public interface ifoo { task<int> bar(); } var mock = new mock<ifoo>(); mock.setup(m => m.bar()).returnstask(4); //await bar() return 4; //example 4 : public interface ifoo { task<int> bar(int x, int y); } var mock = new mock<ifoo>(); mock.setup(m => m.bar(it.isany<int>(), it.isany<int>())) .returnstask<ifoo, int, int, int>((x,y) => x + y); //await bar(x, y) return x + y;
Comments
Post a Comment