Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在MSpec中对伪造对象的调用必须失败?_C#_Unit Testing_Mspec_Fakeiteasy - Fatal编程技术网

C# 为什么在MSpec中对伪造对象的调用必须失败?

C# 为什么在MSpec中对伪造对象的调用必须失败?,c#,unit-testing,mspec,fakeiteasy,C#,Unit Testing,Mspec,Fakeiteasy,运行以下测试时,所有断言都失败。无法找出它们失败的原因,因为实际实现确实调用了对象 这是已知的bug吗?因为其他一些测试确实成功了 [Subject("Pst Cleanup")] public class When_running_Pst_CleanUp { Establish context = () => { _folders = A.Fake<IOutlookFolderParameters>(); _

运行以下测试时,所有断言都失败。无法找出它们失败的原因,因为实际实现确实调用了对象

这是已知的bug吗?因为其他一些测试确实成功了

[Subject("Pst Cleanup")]
public class When_running_Pst_CleanUp
{
    Establish context = () =>
    {
        _folders = A.Fake<IOutlookFolderParameters>();
        _processor = A.Fake<IOutlookPstCleaner>();
    };

    Because of = () => _processor.Cleanup(_folders);

    It should_cleanup_the_mail_folder = () => A.CallTo(() => _folders.EmailFolder).MustHaveHappened();
    It should_cleanup_tasks_folder = () => A.CallTo(() => _folders.TaskFolder).MustHaveHappened();
    It should_cleanup_appointments_folder = () => A.CallTo(() => _folders.AppointmentFolder).MustHaveHappened();

    private static IOutlookPstCleaner _processor;
    private static IOutlookFolderParameters _folders;
}
[主题(“Pst清理”)]
运行\Pst\u清理时的公共类
{
建立上下文=()=>
{
_folders=A.Fake();
_处理器=A.Fake();
};
因为=()=>\u处理器清理(\u文件夹);
它应该清理邮件文件夹=()=>A.CallTo(()=>\u folders.EmailFolder.musthaveOccessed();
它应该_cleanup_tasks_folder=()=>A.CallTo(()=>_folders.TaskFolder.musthaveOccessed();
它应该是_cleanup_appointment_folder=()=>A.CallTo(()=>_folders.AppointmentFolder).musthaveOccessed();
专用静态IOutlookPstCleaner _处理器;
私有静态IOutlookFolderParameters\u文件夹;
}
以下调用的断言失败:Outlook.Contracts.IOOutLookFolderParameters.get_NotificationsFolder()应至少找到一次,但未调用假对象

在fakeitesy.Core.FakeAsserter.assertwas调用(Func
2 调用谓词, 一串 电话描述, Func
2 重复谓词, 一串 repeatDescription)在fakeitesy.Configuration.RuleBuilder.musthaveOccessed(重复 repeatConstraint)在UnitTests中。当运行\u Pst\u CleanUp.b\u 2()在运行\u Pst\u CleanUp.cs时:第19行


这是绝对正确的造假行为。您需要使用
IOutlookPstCleaner
的实际实现来确保测试成功。始终确保你伪造了正确的东西,不要意外地伪造你的SUT

对属性的测试只是被称为测试,您绝对没有任何有价值的东西。我也可以为
IOutlookPstCleaner
编写这个实现,您的测试就会成功:

公共类清理器:IOutlookPstCleaner
{
公共无效清除(IOutlookFolderParameters文件夹)
{
var email=folders.EmailFolder;
var task=folders.TaskFolder;
var appointment=folders.AppointmentFolder;
}
}

如果您发布了
IOutlookPstCleaner
的实现,我很乐意帮助您找到正确的测试内容。

只是添加了测试结果。我实际上没有看到与错误匹配的断言。我没有看到调用
get\u NotificationsFolder()
(看起来像是为自动属性或其他对象生成的方法)的期望。为什么要测试getter被调用?这不能很好地约束你的行为。
\u处理器
对那些您可以在其上声明的文件夹做了什么?噢,见鬼,您的
\u处理器
也是假的。那是行不通的。它必须是一个真实的实例。处理器在pst中进行实际清理。我测试属性是否被调用,因为这样我可以确定清理过程中的所有步骤都已完成……但您的_处理器是假的。实际上,您并没有在这里测试自己的任何代码+1在最简单的情况下,这将是替换
\u processor=A.Fake()的问题带有
\u处理器=新的OutlookPstCleaner()