C# 无法初始化模拟类的成员

C# 无法初始化模拟类的成员,c#,unit-testing,interface,moq,C#,Unit Testing,Interface,Moq,我有一个有成员的界面,类似这样: public interface IDataLoader { //other stuff // tools for loading the items to be processed from disk or cloud CustomCollection ItemsToBeProcessed {get; set;} } 我正在为系统中使用这些ItemsToBeProcessed的其他组件执行UTs,我希望避免加载的复杂性和依赖性 在每个

我有一个有成员的界面,类似这样:

public interface IDataLoader
{
    //other stuff
    // tools for loading the items to be processed from disk or cloud
    CustomCollection ItemsToBeProcessed {get; set;}
}
我正在为系统中使用这些
ItemsToBeProcessed
的其他组件执行UTs,我希望避免加载的复杂性和依赖性

在每个UT中,我想用特定的硬编码数据填充要处理的项。然后将数据输入被测模块(处理器模块),并将输出与特定硬编码的预期数据进行比较

我的问题是,我无法初始化此
项以进行处理,我不知道为什么

这是迄今为止我的UT:

[Test]
public void DataProcessor_TestData1_asExpected()
{
    Mock<IDataLoader> mokedAmplifier = new Mock<IDataLoader>(MockBehavior.Loose);
    MainController.Loader = mokedAmplifier.Object;
    if(MainController.Loader.ItemsToBeProcessed == null)
        MainController.Loader.ItemsToBeProcessed = new CustomCollection();

    // here the MainController.Loader.ItemsToBeProcessed is still null.. why???

    var TestData = LoadTestData("testData1.xml");
    var ExpectedData = LoadExpectedData("ExpectedData1.xml")

    MainConroller.Loader.ItemsToBeProcessed.AddRange(TestData);

    var ProcessingModuleBeingTested = new ProcessingModule();
    var results = ProcessingModuleBeingTested.Process(MainController.Loader.ItemsToBeProcessed);
    Asert.isEqual(ExepctedData, results);
}
[测试]
public void DataProcessor_TestData1_asExpected()
{
Mock mokedAmplifier=新的Mock(MockBehavior.Loose);
MainController.Loader=mokedAmplifier.Object;
if(MainController.Loader.ItemsToBeProcessed==null)
MainController.Loader.ItemsToBeProcessed=new CustomCollection();
//这里MainController.Loader.ItemsToBeProcessed仍然为空。为什么???
var TestData=LoadTestData(“testData1.xml”);
var ExpectedData=LoadExpectedData(“ExpectedData1.xml”)
MainConroller.Loader.ItemsToBeProcessed.AddRange(测试数据);
var ProcessingModuleBeingTested=new ProcessingModule();
var结果=ProcessingModuleBeingTested.Process(MainController.Loader.ItemsToBeProcessed);
Asert.isEqual(验证数据、结果);
}

如何初始化此成员?

模拟所需成员,以便在调用时返回可用对象

var collection = new CustomCollection();
var mokedAmplifier = new Mock<IDataLoader>(MockBehavior.Loose);

mokedAmplifier.Setup(_ => _.ItemsToBeProcessed).Returns(collection);

//...

参考以获得理解模拟框架的帮助。

属性只不过是一个get-and-set方法。如果要为模拟实例赋值,只需使用setter方法即可,该方法与getter方法无关。因此,通过fault Mock为您创建一个类似于以下内容的类:

class TheMockClass : IDataLoader
{
    CustomCollection get_ItemsToBeProcessed { return whatever; }
    void set_ItemsToBeProcessed {  }
}
如果您为这个类的一个实例分配了一些东西,那么什么也不会发生,因为setter绝对不会做任何事情(不确定具体的内部结构,但重要的是,即使setter做了任何事情,它也与getter中使用的内容无关)

你可以看到,当被嘲笑时,这两种方法没有任何共同之处。所以你必须同步地模仿。然而,通常只要模拟getter即可返回您的值,因为您只是使用被模拟的值,而不是设置它


您需要设置属性:

    mokedAmplifier.SetupAllProperties();
    MainController.Loader = mokedAmplifier.Object;
    if (MainController.Loader.ItemsToBeProcessed == null)
        MainController.Loader.ItemsToBeProcessed = new CustomCollection();


我无法
SetupGet
,因为处理模块将使用此列表。它应该被初始化,然后被消费。不是每次有人调用getter时都是静态的。哦,哇,你可以在原地烘焙你的模拟界面。。这正是我需要的。完美答案。谢谢男人当我说记录时,我的意思是它会记住你设置它的值,这样它就可以像正常的属性一样使用了。啊,好吧,奥卡,我想这是Keepong track,登录会很有趣:)
mokedAmplifier.Setup(_ => _.ItemsToBeProcessed).Returns(new CustomCollection());
    mokedAmplifier.SetupAllProperties();
    MainController.Loader = mokedAmplifier.Object;
    if (MainController.Loader.ItemsToBeProcessed == null)
        MainController.Loader.ItemsToBeProcessed = new CustomCollection();
    var coll = new CustomCollection();
    mokedAmplifier.Setup(x => x.ItemsToBeProcessed).Returns(coll);