Using Moq can you verify a method call with an anonymous type?

前端 未结 3 1922
萌比男神i
萌比男神i 2021-02-18 17:50

I\'m trying to verify a method call using Moq, but I can\'t quite get the syntax right. Currently I\'ve go this as my verify:

repository.Verify(x => x.Execute         


        
3条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-02-18 18:35

    None of the answers are great when your test assembly is different than the system under test's assembly (really common). Here's my solution that uses Json serialization and then string comparison.

    Test Helper Function:

    using Newtonsoft.Json;
    
    public static class VerifyHelper
    {
        public static bool AreEqualObjects(object expected, object actual)
        {
            var expectedJson = JsonConvert.SerializeObject(expected);
            var actualJson = JsonConvert.SerializeObject(actual);
    
            return expectedJson == actualJson;
        }
    }
    

    Example System Under Test:

    public void DoWork(string input)
    {
         var obj = new { Prop1 = input };
         dependency.SomeDependencyFunction(obj);
    }
    

    Example Unit Test:

    var expectedObject = new { Prop1 = "foo" };
    
    sut.DoWork("foo");
    dependency.Verify(x => x.SomeDependencyFunction(It.Is(y => VerifyHelper.AreEqualObjects(expectedObject, y))), Times.Once());
    
    
    

    This solution is really simple, and I think makes the unit test easier to understand as opposed to the other answers in this thread. However, because it using simple string comparison, the test's anonymous object has to be setup exactly the same as the system under test's anonymous object. Ergo, let's say you only cared to verify the value of a single property, but your system under test sets additional properties on the anonymous object, your unit test will need to set all those other properties (and in the same exact order) for the helper function to return true.

    提交回复
    热议问题