Moq,SetupGet,Mocking a property

我试图模拟一个名为 UserInputEntity的类,它包含一个名为 ColumnNames: 的属性(它确实包含其他属性,我只是简化了问题)

namespace CsvImporter.Entity
{
public interface IUserInputEntity
{
List<String> ColumnNames { get; set; }
}


public class UserInputEntity : IUserInputEntity
{
public UserInputEntity(List<String> columnNameInputs)
{
ColumnNames = columnNameInputs;
}


public List<String> ColumnNames { get; set; }
}
}

我有个演讲课:

namespace CsvImporter.UserInterface
{
public interface IMainPresenterHelper
{
//...
}


public class MainPresenterHelper:IMainPresenterHelper
{
//....
}


public class MainPresenter
{
UserInputEntity inputs;


IFileDialog _dialog;
IMainForm _view;
IMainPresenterHelper _helper;


public MainPresenter(IMainForm view, IFileDialog dialog, IMainPresenterHelper helper)
{
_view = view;
_dialog = dialog;
_helper = helper;
view.ComposeCollectionOfControls += ComposeCollectionOfControls;
view.SelectCsvFilePath += SelectCsvFilePath;
view.SelectErrorLogFilePath += SelectErrorLogFilePath;
view.DataVerification += DataVerification;
}




public bool testMethod(IUserInputEntity input)
{
if (inputs.ColumnNames[0] == "testing")
{
return true;
}
else
{
return false;
}
}
}
}

我已经尝试了下面的测试,其中我模拟了这个实体,尝试让 ColumnNames属性返回一个初始化的 List<string>(),但是它不起作用:

    [Test]
public void TestMethod_ReturnsTrue()
{
Mock<IMainForm> view = new Mock<IMainForm>();
Mock<IFileDialog> dialog = new Mock<IFileDialog>();
Mock<IMainPresenterHelper> helper = new Mock<IMainPresenterHelper>();


MainPresenter presenter = new MainPresenter(view.Object, dialog.Object, helper.Object);


List<String> temp = new List<string>();
temp.Add("testing");


Mock<IUserInputEntity> input = new Mock<IUserInputEntity>();


//Errors occur on the below line.
input.SetupGet(x => x.ColumnNames).Returns(temp[0]);


bool testing = presenter.testMethod(input.Object);
Assert.AreEqual(testing, true);
}

我得到的错误表明有一些无效的参数 + 参数1无法从字符串转换为

System.Func<System.Collection.Generic.List<string>>

如果你能帮忙,我将不胜感激。

194546 次浏览

ColumnNamesList<String>类型的属性,因此在设置时需要在 Returns调用中传递一个 List<String>作为参数(或返回 List<String>的 func)

但是在这一行中,您只需返回一个 string

input.SetupGet(x => x.ColumnNames).Returns(temp[0]);

导致了异常。

将其更改为返回整个列表:

input.SetupGet(x => x.ColumnNames).Returns(temp);

模仿只读属性意味着只使用 getter 方法的属性。

注意 ,您应该将其声明为 virtual,否则将抛出 System.NotSupportedException

如果您使用的是接口,那么这并不适用于您。它可以立即工作,因为模拟框架将动态地为您实现接口。