c# - Verifying a specific parameter with Moq -
public void submitmessagestoqueue_onemessage_submitsuccessfully() { var messageserviceclientmock = new mock<imessageserviceclient>(); var queueablemessage = createsinglequeueablemessage(); var message = queueablemessage[0]; var xml = queueablemessageasxml(queueablemessage); messageserviceclientmock.setup(proxy => proxy.submitmessage(xml)).verifiable(); //messageserviceclientmock.setup(proxy => proxy.submitmessage(it.isany<xmlelement>())).verifiable(); var serviceproxyfactorystub = new mock<imessageserviceclientfactory>(); serviceproxyfactorystub.setup(proxyfactory => proxyfactory.createproxy()).returns(essageserviceclientmock.object); var loggerstub = new mock<ilogger>(); var client = new messageclient(serviceproxyfactorystub.object, loggerstub.object); client.submitmessagestoqueue(new list<imessagerequestdto> {message}); //messageserviceclientmock.verify(proxy => proxy.submitmessage(xml), times.once()); messageserviceclientmock.verify(); }
i'm starting using moq , struggling bit. i'm trying verify messageserviceclient receiving right parameter, xmlelement, can't find way make work. works when don't check particular value.
any ideas?
partial answer: i've found way test xml sent proxy correct, still don't think it's right way it.
public void submitmessagestoqueue_onemessage_submitsuccessfully() { var messageserviceclientmock = new mock<imessageserviceclient>(); messageserviceclientmock.setup(proxy => proxy.submitmessage(it.isany<xmlelement>())).verifiable(); var serviceproxyfactorystub = new mock<imessageserviceclientfactory>(); serviceproxyfactorystub.setup(proxyfactory => proxyfactory.createproxy()).returns(messageserviceclientmock.object); var loggerstub = new mock<ilogger>(); var client = new messageclient(serviceproxyfactorystub.object, loggerstub.object); var message = createmessage(); client.submitmessagestoqueue(new list<imessagerequestdto> {message}); messageserviceclientmock.verify(proxy => proxy.submitmessage(it.is<xmlelement>(xmlelement => xmldeserializer<queueablemessage>.deserialize(xmlelement).messages.contains(message))), times.once()); }
by way, how extract expression verify call?
if verification logic non-trivial, messy write large lambda method (as example shows). put test statements in separate method, don't because disrupts flow of reading test code.
another option use callback on setup call store value passed mocked method, , write standard assert
methods validate it. example:
// arrange myobject saveobject; mock.setup(c => c.method(it.isany<int>(), it.isany<myobject>())) .callback<int, myobject>((i, obj) => saveobject = obj) .returns("xyzzy"); // act // ... // assert // verify method called once mock.verify(c => c.method(it.isany<int>(), it.isany<myobject>()), times.once()); // assert saveobject assert.that(saveobject.theproperty, is.equalto(2));
Comments
Post a Comment