Tuesday, 15 January 2013

c# - Mocks; assigning delegates using Moq -



c# - Mocks; assigning delegates using Moq -

currently

i'm using moq create handful of mock objects; far working nicely. 'assign' delegate using moq i'm doing

var somemock = new mock<isomeinterface>(); somemock.setup(x => x.dosomething(it.isany<int>())).returns(this.dosomething)

where this.dosomething method accepting int parameter; fundamentally it's same construction x.dosomething on isomeinterface.

question

is possible assign delegate, without neeed specifying of parameters, i.e. not using it.isany<int>()? ideally this:

var somemock = new mock<isomeinterface>(); somemock.setup(x => x.dosomething).returns(this.dosomething)

no, that's not possible. that's not "shortcoming" of moq - c# doesn't back upwards it.

some background:

let's assume isomeinterface declared follows:

public interface isomeinterface { void foo(int a, int b); }

that mean parameter of setup method have func<isomeinterface, action<int, int>>. problem setup method have defined in generic way, because method have type of parameters:

setup<t1, t2>(func<t, action<t1, t2>> param)

t generic type mock class, t1 , t2 parameters of method.

calling method result in compiler error:

the type arguments method mock.setup<t1, t2>(system.func<userquery.isomeinterface,system.action<t1,t2>>) cannot inferred usage. seek specifying type arguments explicitly.

to create work, need phone call this:

somemock.setup<int, int>(x => x.dosomething)

or this:

somemock.setup(x => (action<int, int>)x.dosomething);

in both cases, have specify type of parameters, already.

as why compiler error:

x.dosomething method group. there exists implicit conversion action<int, int>. however, implicit conversion executed, compiler needs know types of t1 , t2. types can inferred after conversion took place. 2 steps depend on each other , that's why doesn't work.

c# unit-testing mocking moq

No comments:

Post a Comment