2010-08-22 75 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); 
}