2010-08-22 71 views
2

我想使用moq一个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)); 

我想设置该标识上的保存不再是一个Guid.Empty。 保存是一个无方法,因此没有回报,并使用:

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

不工作..

回答

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); 
}