带对象参数的Moq回调方法

时间:2013-06-11 12:02:04

标签: c#-4.0 tdd moq

在我的场景中,我想模拟一个服务框架方法,该方法接受对象参数并使用强类型类对象重置它。

 public void Updatedata(object pvm)
    {
        var vm = new datamodel()
            {
                name = "test",
                age = 100
            };
        pvm = vm;
    }

它给出了编译错误“无效的回调。带参数(Object)的方法的设置无法使用参数(datamodel)调用回调。”使用以下代码进行模拟。

 mockderived.Setup(p => p.Updatedata(It.IsAny<datamodel>()))
             .Callback<datamodel>(p =>
                 {
                     p.name ="My name is test";
              });

如果我将updatedata方法更改为接受datamodel作为参数而不是对象类型,则模拟工作正常。为避免编译错误,我通过将对象作为参数传递来更改代码:

  mockderived.Setup(p => p.Updatedata(It.IsAny<object>()))
             .Callback<object>(p =>
                 {
                     p = new datamodel() {name = "My name is test"};
              });

它执行的代码没有按照预期更改数据模型的值。

1 个答案:

答案 0 :(得分:2)

使用反射在回调方法中设置object参数的属性后,我能够正确地模拟方法。

   mockderived.Setup(p => p.Updatedata(It.IsAny<object>()))
             .Callback<object>(p =>
                 {
                     var temp = new datamodel();
                     var t = temp.GetType();
                     var nameprop = "no name";
                     var prop = t.GetProperties();
                     prop[0].SetValue(p, nameprop, null);
              });