2013-11-03 104 views
4

我正在使用Xamarin Studio使用MvvmCross開始TDD。我試圖首先測試發佈到視圖模型的消息的效果,以便只有在收到適當的消息時才執行邏輯。如何使用IMvxMessenger對MvvmCross進行單元測試

我將Stuart的一些優秀教程一起入侵,導致位置數據成功傳播以查看模型,然後更新iOS視圖中的一些文本控件,地圖標記等。

但是在我進一步深入之前,我想使用TDD進行編碼。我如何人工設置視圖模型並在我的測試工具中人爲地發佈消息給它? :

public class MyViewModel : MvxViewModel 
{ 
    private readonly MvxSubscriptionToken _token; 

    public MyViewModel(ILocationService service, IMvxMessenger messenger) 
    { 
     //weak reference 
     _token = messenger.Subscribe<LocationMessage>(OnLocationMessage); 
    } 

    private void OnLocationMessage(LocationMessage locationMessage) 
    { 
     Lat = locationMessage.Lat; 
     Lng = locationMessage.Lng; 
     // Console.WriteLine("on loc msg {0:0.0000}, {1:0.0000}", Lat, Lng); 
    } 

    private double _lng; 
    public double Lng 
    { 
     get { return _lng; } 
     set 
     { 
      _lng = value; 
      RaisePropertyChanged(() => Lng); 
     } 
    } 

    private double _lat; 
    public double Lat 
    { 
     get { return _lat; } 
     set 
     { 
      _lat = value; 
      RaisePropertyChanged(() => Lat); 
     } 
    } 
} 


[TestFixture()] 
public class LocTest 
{ 
    [Test()] 
    public void LocationMessageIsRecieved() 
    { 
     // im using nsubstitute to mock with 
     var locService = Substitute.For<ILocationService>(); 
     var msgr = Substitute.For<IMvxMessenger>(); 
     var vm = new Map2ViewModel(locService, msgr); 

     var locMsg = new LocationMessage(this, 1F, 2F); 
     msgr.Publish(locMsg); 

     var lat = vm.Lat; 
     Assert.AreEqual(2F, lat); // says lat is 0.0 and nunit doesnt let me debug the tests :(
    } 
} 

與MvvmCross TDD任何偉大的教程將是非常美妙

+0

您基本上可以創建MvxMessengerHub,如Greg Shackles github回購所示(請參閱下面的Stuart答案中的鏈接) –

回答

8

在TDD任何偉大的教程與MvvmCross將是非常美妙

格雷格鐐銬的在演變的談話是一個很好的起點爲此的位置 - http://xamarin.com/evolve/2013#session-7wb0etd3r8

他的CodeCamp示例包含一組極好的單元測試示例 - http://www.gregshackles.com/2013/09/nyc-code-camp-8-mobile-apps/導致https://github.com/gshackles/NycCodeCamp8/tree/master/CodeCamp.Core/tests/CodeCamp.Core.Tests/ViewModelTests

上MvvmCross單元測試教程 - 包括嘲諷 - 是http://mvvmcross.wordpress.com/

在N = 29獲得博客中,也可在http://blog.fire-development.com/2013/06/29/mvvmcross-enable-unit-testing/

2

我如何人爲地設置了viewmodel並在我的測試工具中人爲地發佈消息給它? :

在上link斯圖爾特張貼描述設置後,將圖案我已經用於測試MvxMessenger是使用Moq(連同AutoFixture),以創建一個模擬IMvxMessenger並注入它:

_mockMvxMessenger = Fixture.Freeze<Mock<IMvxMessenger>>(); 
_myViewModel = _fixture.Build<MyViewModel().OmitAutoProperties().Create(); 

以上假設您將IMvxMessenger注入ViewModel。

如果您需要檢查的消息已經公佈,您可以斷言(驗證)在模擬

_myViewModel.MyCommand.Execute (null); 
_mockMvxMessenger.Verify (m => m.Publish (It.IsAny<MyMvxMessage>()), Times.Once); 

如果您需要觸發的消息,然後抓住訂閱行動和你的時候火了像

凍結素後視圖模型,但建設之前:

private Action<MyMvxMessage> _callbackAction; // class scope var 
_mockMvxMessenger.Setup (n => n.Subscribe<MyMvxMessage> (It.IsAny<Action<MyMvxMessage>>(), It.IsAny<MvxReference>(), It.IsAny<string>())).Callback<Action<MyMvxMessage>, MvxReference, string> ((action,mvxref,tag) => _callbackAction = action); 
在測試

然後你可以「火消息」通過只調用

_callbackAction(new MyMvxMessage(this)); 
相關問題