Издеваться с носорогом издеваться -MVVM - PullRequest
2 голосов
/ 02 марта 2012

Я использую макет Rhino для насмешек в моих методах испытаний.Может кто-нибудь, пожалуйста, посмотрите на часть TODO в методе теста и помогите мне ее смутить?

Это мой сервисный интерфейс:

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

Это моя модель представления

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 в ViewModel выше.Итак, в моем методе тестирования я хочу смоделировать метод void SaveCustomer(POC.Model.Customer cust, EventHandler<SaveCustomerCompletedEventArgs> callback) в интерфейсе ICustomersServiceAgent.

Это мой метод тестирования, см. Часть 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);
}

Может кто-тообъясните пожалуйста как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2013

Попробуйте следующее:

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 голосов
/ 02 марта 2012

Не понимаю, зачем вам издеваться над SaveCustomer.Все, что делает частный метод SaveCustomer - это вызывает службу ServiceAgent, над которой вы уже издеваетесь.Я предполагаю, что класс RelayCommand вызывает делегат, который вы отправляете, в параметре конструктора, который является вызовом SaveCustomer.Вы пытались запустить модульный тест в своем вопросе как есть?

...