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);