Moq在调用void方法时修改protected

时间:2010-08-22 23:08:03

标签: moq protected void

我想使用moq一个void方法,并在调用时为受保护的属性设置一个值。

public class MyClass{ public Guid Id {get; protected set; } }

public interface IMyRespository { public void Save(MyClass myClass); }

类似的东西:

var moq = new Mock<IMyRespository>();
var my = new MyClass();
moq.Setup(x=>x.Save(my));

我想设置保存时的Id不再是Guid.Empty。 保存是一个void方法,所以没有返回,并使用:

.Callback(() => my = new MyClassImpl(new Guid("..")))

无法正常工作..

1 个答案:

答案 0 :(得分:2)

首先,您必须正确设置期望值。我认为你真正想要的是设置模拟,以便它接受MyClass

的任何实例
moq.Setup(x=>x.Save(It.IsAny<MyClass>()));

然后,你设置一个像这样的回调:

moq.Setup(x=>x.Save(It.IsAny<MyClass>()))
   .Callback((myClassParam) => my = myClassParam);

将所有内容放在一起将允许您构建一个接受MyClass的模拟并将MyClass实例保存到my变量:

[TestMethod]
public void Test() {
  var moq = new Mock<IMyRespository>();
  MyClass my = null;
  moq.Setup(x=>x.Save(It.IsAny<MyClass>()))
     .Callback((myClassParam) => my = myClassParam);
  var newMyClass = new MyClassImpl(new Guid(".."));
  moq.Object.Save(newMyClass);
  Assert.AreSame(newMyClass, my);
}