2012-03-02 8 views
2

私のテストメソッドでは、模擬用にRhinoモックを使用しています。誰かがテスト方法でTODOの部分を見て、それを嘲笑するのを手伝ってもらえますか?Rhinoモック付きモック-MVVM

これは私のサービス・インターフェースである:

public interface ICustomersServiceAgent 
{ 
    void GetCustomers(EventHandler<GetCustomersCompletedEventArgs> callback); 
    void SaveCustomer(POC.Model.Customer cust, EventHandler<SaveCustomerCompletedEventArgs> callback); 
} 

これは、私は上記のViewModelにSaveCustomerCommandをテストしたい私のViewModel

public class CustomerVM : ViewModelBase 
{ 
    private Model.Customer _curentCustomer; 
    private RelayCommand _saveCommand; 
    private ICustomersServiceAgent ServiceAgent { get; set; } 
    private bool isSaved; 
    private RelayCommand _calculateAgeCommand; 
    private Decimal age; 
    private DateTime dateOfBirth; 

    public CustomerVM(ICustomersServiceAgent serviceAgent) 
    { 
     if (serviceAgent == null) 
     { 
      ServiceAgent = ServiceManager.GetCustomerServiceManagement(); 
     } 
     else 
     { 
      ServiceAgent =serviceAgent; 
     } 
     WireCommands(); 
    } 

    // if curent object is null then it should be intialize 
    public Model.Customer CurentCustomer 
    { 
     get { return _curentCustomer ?? (_curentCustomer = new Model.Customer()); } 
     set 
     { 
      if (_curentCustomer != value) 
      { 
       _curentCustomer = value; 
       OnPropertyChanged("CurentCustomer"); 
      } 
     } 
    } 

    public RelayCommand CalculateAgeCommand 
    { 
     get; 
     private set; 
    } 

    private void WireCommands() 
    { 
     SaveCustomerCommand = new RelayCommand(SaveCustomer); 
     SaveCustomerCommand.IsEnabled = true; 
     CalculateAgeCommand = new RelayCommand(CalculateAge); 
    } 

    private void SaveCustomer() 
    { 
     var cus = CurentCustomer; 
     ServiceAgent.SaveCustomer(cus, (s, e) => 
     { 
      IsSaved = e.Result; 
     }); 
    } 

    private void CalculateAge() 
    { 
     Age = DateTime.Now.Year - DateOfBirth.Year;   
    } 

    public RelayCommand SaveCustomerCommand 
    { 
     get; 
     private set; 
    } 

    public bool IsSaved 
    { 
     get { return isSaved; } 
     set 
     { 
      isSaved = value; 
      OnPropertyChanged("IsSaved"); 
     } 
    } 

    public decimal Age 
    { 
     get { return age; } 
     set { 
      age = value; 
      OnPropertyChanged("Age"); 
     } 
    } 

    public DateTime DateOfBirth 
    { 
     get { return dateOfBirth; } 
     set { 
      dateOfBirth = value; 
      OnPropertyChanged("DateOfBirth"); 
     } 
    } 
} 

です。 だから、私のテスト方法では、ICustomersServiceAgentインターフェイスでvoid SaveCustomer(POC.Model.Customer cust, EventHandler<SaveCustomerCompletedEventArgs> callback)メソッドを擬似したいと思う。

これは私の試験方法である、ToDoの部分を参照してください

[TestMethod] 
public void SaveCustomerCommandTest() 
{ 
    var customerServiceMock = MockRepository.GenerateMock<ICustomersServiceAgent>(); 
    var customerVM = new POC.SilverlightClient.ViewModel.CustomerVM(customerServiceMock); 

    // TO do : Code to mock SaveCustomer method /////////////////////////////////// 

    var saveCustomerCommand = customerVM.SaveCustomerCommand; 
    saveCustomerCommand.Execute(null); 

    Assert.IsTrue(customerVM.IsSaved); 
} 

は、誰かが、私はこれを行うことができますどのように説明していただけますか?

答えて

0

なぜSaveCustomerをモックする必要があるのか​​分かりません。すべてのプライベートSaveCustomerメソッドは、あなたがすでに嘲笑しているServiceAgentサービスを呼び出します。 RelayCommandクラスが、SaveCustomerへの呼び出しであるコンストラクターパラメーターで送信している代理人を呼び出すと仮定します。単体テストをそのままの状態で実行しようとしましたか?

+0

は、それが動作しませんYes.But。それは私が模倣したいICustomersServiceAgent.Soだけです。 SaveCustomerメソッド。残念ながら私はそれを行うことができませんでした.. – DKD

+0

ユニットテストが「うまくいかない」方法を説明する質問を編集すると、そうしようとしているし、助けることができるかもしれません。 –

0

次試してみてください。SaveCustomerメソッドはモックれていないため

customerServiceMock.Stub(sa => sa.SaveCustomer(Arg<POC.Model.Customer>.Is.Anything, Arg<EventHandler<SaveCustomerCompletedEventArgs>>.Is.Anything)).WhenCalled(invocation => 
     { 
      ((EventHandler<SaveCustomerCompletedEventArgs>)invocation.Arguments[1])(
customerServiceMock, 
new SaveCustomerCompletedEventArgs { Result = true }); 
     }); 
+0

ああ。 1歳です:) –

関連する問題