2012-03-02 108 views
2

我正在使用Rhino模拟模拟嘲笑我的测试方法。有人能看到测试方法中的TODO部分,并帮助我嘲笑它吗?模拟犀牛模拟-MVVM

这是我的服务接口:

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

这是我的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"); 
     } 
    } 
} 

我想测试在视图模型的SaveCustomerCommand以上。 所以在我的测试方法中,我想模拟ICustomersServiceAgent界面中的void SaveCustomer(POC.Model.Customer cust, EventHandler<SaveCustomerCompletedEventArgs> callback)方法。

这是我的测试方法,请参阅待办事项部分

[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这是行不通的,因为SaveCustomer方法不嘲笑。它只是模拟ICustomersServiceAgent.So,我想模拟 SaveCustomer方法。很遗憾,我做不到。 – DKD 2012-03-07 12:09:44

+0

如果编辑你的问题来描述单元测试“不起作用”,那么人们会得到更多关于你的信息正在努力并可能有所帮助。 – 2012-03-07 13:16:18

0

尝试以下操作:

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

哦。这是一岁:) – 2013-04-12 09:47:27