2009-10-15 22 views
1

我有一个抽象类,我试图用Rhino Mocks模拟出附加到它的事件。这里抽象类的一点嘲笑通过其他对象的构造函数附加到抽象类的事件

public abstract class Download 
{ 

    public virtual event EventHandler<DownloadProgressEventArgs> DownloadProgress_Changed; 

    protected virtual void OnDownloadProgressChanged(DownloadProgressEventargs e) 
    { 
     if(DownloadProgress_Changed != null) 
     { 
      DownloadProgress_Changed(this, e); 
     } 

    } 

    // abstract method declarations etc 
} 

我把事件标记为虚拟的,以便它可以被模拟。

在我的应用程序下载被送入DownloadEntity的构造函数中,constructore下载了它的事件挂接内,如下

public class DownloadEntity 
{ 
    private Download _download; 

    public DownloadEntity(Download download) 
    { 
     _download = download; 
     _download.DownloadProgressChanged += new EventHandler<DownloadProgressEventArgs>(download_DownloadProgressChanged); 

    } 

    public virtual void download_DownloadProgressChanged(object sender, DownloadProgressEventArgs e) 
    { 
    // stuff done here 
    } 

// other code and stuff in the class 

}

所以,这是非常straightforwards,我想模拟出的下载和使用DownloadEntity验证事件附加,为了这个,我已经使用了流畅的犀牛嘲笑语法如下

[Test] 
    public void DownloadAttachesEventsWhenCreated() 
    { 
     MockRepository mocks = new MockRepository(); 
     Download dl = mocks.DynamicMock<Download>(); 
     DownloadEntity dle; 
     With.Mocks(mocks).Expecting(delegate 
     { 
      dl.DownloadProgressChanged += new EventHandler<DownloadProgressEventArgs>(DummyHandler); 
     }) 
     .Verify(delegate 
     { 
      // verify it is called by creating a new DownloadEntity and injecting the mock 
      dle = new DownloadEntity(dl); 
     }); 

    } 

    void DummyHandler(object sender, DownloadProgressEventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

即使当我浏览代码时,我也会看到该处理程序已附加到Mocked下载。这让我真的陷入了困境,我不能帮助,但我想在这里失去一些真正明显的东西。

谢谢!

+0

我刚刚通过在以上测试中执行了以下操作 我将代码更改为 dl.DownloadProgressChanged + = null; LastCall.Constraints(Is.NotNull()); 为什么地球上它现在的工作? – Matt 2009-10-15 14:57:02

回答

1

我正在使用Rhino Mocks 3.5,这就是我必须做的所有事情,以正确测试事件绑定的功能。

[Test] 
public void Download_attaches_events_when_created() 
{ 
    // Arrange 
    var download = MockRepository.GenerateMock<Download>(); 

    // Act 
    var downloadEntity = new DownloadEntity(download); 

    // Assert 
    download.AssertWasCalled(x => x.DownloadProgress_Changed += Arg<EventHandler<DownloadProgressEventArgs>>.Is.Anything); 
} 

如果您不使用3.5或更高版本,并且您可以升级,我会考虑它使您的测试更简单。

+0

您好克里斯,感谢您的答案,即时通讯使用rhino 3.6所以我熟悉AAA机制和您的解决方案,我更困惑为什么我的解决方案不工作使用新的流利模拟,正如我的评论所说,如果我添加一个约束它的工作原理正确地说,我只是希望有人能解释为什么它需要约束,为什么原来没有工作 – Matt 2009-10-18 19:18:04