簡體   English   中英

驗證使用Moq調用了我的方法

[英]Verify my method was called using Moq

我有以下課程:

public class ConsignorViewModel : ViewModel
{
    #region Members
    private Consignor _model;
    #endregion

    #region Properties

    public string SearchTerm
    {
        get { return _model.SearchTerm; }
        set
        {
            if (_model.SearchTerm != value)
            {
                _model.SearchTerm = value;
                RaisePropertyChanged("SearchTerm");
            }
        }
    }

    ...
    #endregion Properties

    protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpresssion)
    {
        var propertyName = PropertySupport.ExtractPropertyName(propertyExpresssion);
        this.RaisePropertyChanged(propertyName);
    }

    protected void RaisePropertyChanged(String propertyName, bool validatePropertyName = true)
    {
        if(validatePropertyName) VerifyPropertyName(propertyName);
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }
}

我基本上想測試在為我的SearchTerm屬性設置值時是否使用正確的參數(“ SearchTerm”)調用了“ RaisePropertyChanged”方法。

我想因此我必須嘲笑我的課程。 如何使用Moq進行操作?

這不是Moq的用例-您不能嘲笑被測類。

但是您可以像這樣測試INotifyPropertyChanged模式:

var vm = new ConsignorViewModel();
var raised = 0;

vm.PropertyChanged += (sender, e) => {
  if (e.PropertyName == "SearchTerm")
    ++raised;
  else
    Assert.Fail("Unexpected property name");
}

vm.SearchTerm = "42";
Assert.That(raised, Is.EqualTo(1));

也許Moq不是在那里使用的最佳工具。

如果將RaisePropertyChanged方法RaisePropertyChanged virtual可以使用Moq進行RaisePropertyChanged

protected virtual void RaisePropertyChanged(String propertyName, bool validatePropertyName = true)
    ...

然后這將起作用:

var mock = new Mock<ConsignorViewModel>(MockBehavior.Loose /* , constructorArguments */);

// use mock
mock.Object.SearchTerm = "42";

// verify the call
mock.Verify(x => x.RaisePropertyChanged("SearchTerm", true));

為了編譯箭頭x => x.RaisePropertyChanged("SearchTerm", true) ,必須從測試代碼所在的位置訪問方法RaisePropertyChanged 由於它是一種protected方法,因此您必須在(是) RaisePropertyChanged派生的類中創建測試代碼。 如果這樣做不方便,您可以接受放松RaisePropertyChanged的訪問級別,例如:

protected internal virtual void RaisePropertyChanged( ... )
    ...

然后,測試僅必須在同一程序集(項目)中。

否則,您可以使用Moq對protected成員的支持,但這有點難看:

using Moq.Protected;

...

// verify the call
mock.Protected().Verify("RaisePropertyChanged", Times.Once(), "SearchTerm", true);
// Note that "RaisePropertyChanged" is a string,
// since the name RaisePropertyChanged is not in scope.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM