下面的示例代码,但简而言之:
> button_click将引发一个VIEw Event.
> Presenter订阅此VIEwEvent并捕获args(即消息)
> Presenter完成工作(字符串连接)并更新模型
>视图重新绑定到Model.Message属性&一切正常.
//Modelpublic class HelloWorldModel { public string Message { get; set; }}//Argspublic class HelloWorldEventArgs : EventArgs { public string Message { get; set; }}//VIEwpublic interface IHelloWorldVIEw : IVIEw<HelloWorldModel> { event EventHandler<HelloWorldEventArgs> SendMessage;}//Presenterpublic class HelloWorldPresenter : Presenter<IHelloWorldVIEw> { private Readonly EventHandler<HelloWorldEventArgs> SendMessageDelegate; public HelloWorldPresenter(IHelloWorldVIEw vIEw) : base(vIEw) { SendMessageDelegate = ((s,e) => SendMessageReceived(e.Message)); VIEw.SendMessage += SendMessageDelegate; } public overrIDe voID ReleaseVIEw() { VIEw.SendMessage -= SendMessageDelegate; } public voID SendMessageReceived(string message) { VIEw.Model.Message = string.Format("Hello World! - {0}",message); }}//VIEw implementation[PresenterBinding(typeof(HelloWorldPresenter))]public partial class HelloWorld : MvpPage<HelloWorldModel>,IHelloWorldVIEw{ protected voID EchobuttonClick(object sender,EventArgs e) { if(SendMessage != null) { var args = new HelloWorldEventArgs {Message = MessageTextBox.Text}; SendMessage(sender,args); } } public event EventHandler<HelloWorldEventArgs> SendMessage;}
我的问题在于测试.
由于VIEw负责从模型中更新自身,因此Presenter仅设置Model.Message属性…因此在单元测试中,我想执行以下 *** 作.
>模仿我的IHelloWorldVIEw
>用模拟实例化我的礼物.
>在Mock上触发事件
>验证当前是否设置了模拟的Model.Message属性.
[TestMethod]public voID TestMethod1(){ var input = "My Message"; var expected = string.Format("Hello World! - {0}",input); var mock = new Mock<IHelloWorldVIEw> { DefaultValue = DefaultValue.Mock }; var pres = new HelloWorldPresenter(mock.Object); mock.Raise(m => m.SendMessage += null,new HelloWorldEventArgs { Message = input }); mock.VerifySet(vIEw => vIEw.Model.Message = It.Is<string>(s => s == expected),Times.Once());}
但这不会起作用,除非我明确地将我的模型的Message属性标记为虚拟,我真的不想这样做.例如
//Modelpublic class HelloWorldModel { public string Message { get; set; }}
我的其他选项是使用被动视图模式并在IHelloWorldVIEw上将asp:标签Text作为字符串属性公开,并直接从Presenter设置…然后我应该能够测试它.
>被动是否从测试的角度看待更好的方法?
>我是否有必要同时模拟我的模型(我不确定WebFormsMVP中是否可行?
要么
>我需要制作Model Virtual的所有属性
要么
>我错过了某个地方的观点吗?
Assert.That(mock.Object.Model.Message,Is.EqualTo(expected));
这个小的(但在语义上相等)变化的美妙之处在于你的模拟突然变成了一个存根,你正在测试最终结果而不是细节的实现细节.至于你的问题,在可测试性方面设计你的系统是一件好事,但我不会开始虚拟化或接口所有东西只是为了使它对Moq友好;制作一个SolID架构,不需要Moq-able.
总结以上是内存溢出为你收集整理的c# – 在使用监督控制器模式时,我应该如何使用Moq视图对我的WebFormMVP演示者进行单元测试全部内容,希望文章能够帮你解决c# – 在使用监督控制器模式时,我应该如何使用Moq视图对我的WebFormMVP演示者进行单元测试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)