我们有具有“保存”方法的存储库。每当保存实体时,它们也会抛出“创建”事件。
我们一直在尝试使用Moq来模拟存储库....
var IRepository = new Mock<IRepository>();
Request request = new Request();
IRepository.Setup(a => a.Save(request)).Raises(a => a.Created += null, RequestCreatedEventArgs.Empty);
这似乎不起作用,我总是得到一个例外:
System.Reflection.TargetParameterCountException: 参数计数不匹配。
任何使用Moq模拟事件的例子都会有所帮助。
答案 0 :(得分:3)
标准事件类型委托通常有两个参数:sender对象和EventArgs子类对象。 Moq期望从您的事件中获得此签名,但只发现一个参数,这会导致异常。
使用我的评论来查看此代码,它应该可以工作:
public class Request
{
//...
}
public class RequestCreatedEventArgs : EventArgs
{
Request Request {get; set;}
}
//=======================================
//You must have sender as a first argument
//=======================================
public delegate void RequestCreatedEventHandler(object sender, RequestCreatedEventArgs e);
public interface IRepository
{
void Save(Request request);
event RequestCreatedEventHandler Created;
}
[TestMethod]
public void Test()
{
var repository = new Mock<IRepository>();
Request request = new Request();
repository.Setup(a => a.Save(request)).Raises(a => a.Created += null, new RequestCreatedEventArgs());
bool eventRaised = false;
repository.Object.Created += (sender, e) =>
{
eventRaised = true;
};
repository.Object.Save(request);
Assert.IsTrue(eventRaised);
}
答案 1 :(得分:0)
似乎从RequestCreatedEventArgs.Empty
返回的任何内容都无法转换为RequestCreatedEventArgs
对象。我希望如下:
class IRepository
{
public event THING Created;
}
class THING : EventArgs
{
public static THING Empty
{
get { return new THING(); }
}
}
验证代码中每个位置的THING是否相同,如上所示。