嘲笑犀牛模拟-MVVM

时间:2012-03-02 10:53:30

标签: unit-testing .net-4.0 mocking rhino-mocks

我在我的测试方法中使用Rhino mock进行模拟。有人可以在测试方法中看到TODO部分并帮我模拟它吗?

这是我的服务界面:

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");
        }
    }
}

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

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

[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);
}

有人可以解释一下我该怎么做吗?

2 个答案:

答案 0 :(得分:0)

我不明白为什么你需要模拟SaveCustomer。所有私有的SaveCustomer方法都会调用您已经嘲笑的ServiceAgent服务。我假设RelayCommand类调用您在构造函数参数中发送的委托,该参数是对SaveCustomer的调用。您是否尝试按原样在问题中运行单元测试?

答案 1 :(得分: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 });
        });