NMock學習系列(二)--- NMock在MVP架構系統的單元測試中的應用

介紹

        上篇已經學習了NMock的一些基礎概念和代碼,同時也想到了可能的兩個應用場景,本篇開始學習下第一個應用場景---NMock在MVP架構模式下的應用場景。MVP的架構模式概念比較簡單,主要是以接口的形式隔離視圖與控制器之間的耦合,具體對於MVP模式的介紹請自行搜索學習。本篇接下來的學習前提是讀者瞭解MVP的架構模式,主要明白視圖接口的解耦。


應用場景

        基於MVP模式的項目往往業務邏輯的編寫和視圖的建立是分開進行的,視圖只需定義出接口供業務控制器進行依賴調用。所以如果在視圖還未具體實現的情況下,我們想要對各個業務控制器進行單元測試的前提必須要模擬出視圖接口的行爲及屬性。這時我們就可以使用NMock來進行輔助測試了。下面開始直接退出代碼實例:

        首先視圖接口定義如下:
        public interface IViewBase
        {
             int ID { get; }
             string Name { get; set; }
	     event EventHandler Init;
        }
        
        控制器定義如下
        public class PresenterBase
	{
		public string Status { get; protected set; }

		public PresenterBase(IViewBase view)
		{
			View = view;

			Status = "Constructed";
		}

		protected IViewBase View{ get; private set;}

		public void BindEventsInternal()
		{
			View.Init += view_Init;
			BindEvents();
		}

		protected virtual void BindEvents()
		{}


		private void view_Init(object sender, EventArgs e)
		{
			Status = "Init";
		}
	}

具體的數據模型我就不定義了,因爲這個應用場景中暫時不考慮到模型。
要想建立控制器方法BindEventsInternal的單元測試,我們必須要定義出一個具體實現了接口IViewBase的類,我們就可通過NMock進行模擬,代碼如下:
        private MockFactory _factory;

        [TestInitialize]
        public void TestInitialize()
        {
            _factory = new MockFactory();  
        }

        [TestMethod]
        public void TestMockMVP()
        {
            Mock<IViewBase> _View = _factory.CreateMock<IViewBase>();

            //設置事件
            _View.Expects.One.EventBinding(v => v.Init += null);    //模擬方法
            //若是泛型則寫法如下
            //_View.Expects.One.EventBinding<類型>(v => v.Init += null);    
            PresenterBase presenter = new PresenterBase(_View.MockObject);
            Assert.IsNotNull(presenter);
        }

這樣模擬出的_View.MockObject相當於一個實現了IViewBase的具體類的實例。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章