[英]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.