{"id":65,"date":"2016-09-06T19:07:03","date_gmt":"2016-09-06T23:07:03","guid":{"rendered":"http:\/\/langstonsoftware.com\/?p=65"},"modified":"2016-09-06T15:07:49","modified_gmt":"2016-09-06T19:07:49","slug":"moq-cant-setup-methods-with-anonymous-object-arguments","status":"publish","type":"post","link":"https:\/\/langstonsoftware.com\/2016\/09\/06\/moq-cant-setup-methods-with-anonymous-object-arguments\/","title":{"rendered":"Moq can’t setup methods with anonymous object arguments"},"content":{"rendered":"

Something frustrating I learned today about my favorite Mocking tool today, or at least in version 4.0 that I have installed, it can’t handle anonymous objects in method parameters. This is very depressing in web programming where it doesn’t make much sense to create a static DTO type for every version of a API call.<\/p>\n

\r\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\r\nusing Moq;\r\n\/\/Moq version 4.0.10827\r\n\r\nnamespace AX.Test.Common\r\n{\r\n    public class ExampleAnonObjMockSetup\r\n    {\r\n        public interface IThing\r\n        {\r\n            string DoIt<T>(T it);\r\n        }\r\n\r\n        public class Subject\r\n        {\r\n            private readonly IThing _thing;\r\n\r\n            public Subject(IThing thing)\r\n            {\r\n                _thing = thing;\r\n            }\r\n\r\n            public string Execute()\r\n            {\r\n                var param = new\r\n                {\r\n                    Foo = "bar",\r\n                    Baz = 23\r\n                };\r\n                return _thing.DoIt(param);\r\n            }\r\n        }\r\n\r\n        [TestClass]\r\n        public class SubjectTest\r\n        {\r\n            [TestMethod]\r\n            public void Test()\r\n            {\r\n                var mockThing = new Mock<IThing>();\r\n                mockThing.Setup(t => t.DoIt(It.IsAny<object>()))\r\n                    .Returns("expectedResult");\r\n\r\n                var subject = new Subject(mockThing.Object);\r\n                var result = subject.Execute();\r\n\r\n                Assert.AreEqual("expectedResult", result);\r\n                \/\/Assert.AreEqual failed. Expected:<expectedResult>. Actual:<(null)>\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n

I’ve played with this code some more this Gist: https:\/\/gist.github.com\/thomaslangston\/46734b4577d1d3eac8c9d2c331f9e278<\/a><\/p>\n

Others have reported that this behavior is fixed in Moq 4.1, but I have not yet verified. http:\/\/stackoverflow.com\/questions\/34185691\/moq-setup-method-with-generic-anonymous-parameter<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"

Something frustrating I learned today about my favorite Mocking tool today, or at least in version 4.0 that I have installed, it can’t handle anonymous objects in method parameters. This is very depressing in web programming where it doesn’t make much sense to create a static DTO type for every version of a API call. …<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[2,9,8],"tags":[],"class_list":["post-65","post","type-post","status-publish","format-standard","hentry","category-c","category-moq","category-unit-testing"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6Os38-13","_links":{"self":[{"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/posts\/65"}],"collection":[{"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/comments?post=65"}],"version-history":[{"count":5,"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/posts\/65\/revisions"}],"predecessor-version":[{"id":552,"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/posts\/65\/revisions\/552"}],"wp:attachment":[{"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/media?parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/categories?post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/langstonsoftware.com\/wp-json\/wp\/v2\/tags?post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}