我正在尝试测试使用ASP.NET WebFormsMVP创建的Presenter.我正在使用“监督控制器”模式构建它,因此View负责从模型中更新自身.我简化了以下带有文本框,按钮和按钮的页面示例.标签.您输入文本框&按下按钮和文本HelloWorld! <你的文字>被放在标签上.
下面的示例代码,但简而言之:
> button_click将引发一个View Event.
> Presenter订阅此ViewEvent并捕获args(即消息)
> Presenter完成工作(字符串连接)并更新模型
>视图重新绑定到Model.Message属性&一切正常.
//Model public class HelloWorldModel { public string Message { get; set; } } //Args public class HelloWorldEventArgs : EventArgs { public string Message { get; set; } } //View public interface IHelloWorldView : IView<HelloWorldModel> { event EventHandler<HelloWorldEventArgs> SendMessage; } //Presenter public 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属性标记为虚拟,我真的不想这样做.例如
//Model public class HelloWorldModel { public string Message { get; set; } }
我的其他选项是使用被动视图模式并在IHelloWorldView上将asp:标签Text作为字符串属性公开,并直接从Presenter设置…然后我应该能够测试它.
>被动是否从测试的角度看待更好的方法?
>我是否有必要同时模拟我的模型(我不确定WebFormsMVP中是否可行?
要么
>我需要制作Model Virtual的所有属性
要么
>我错过了某个地方的观点吗?
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。