【问题标题】:Using Moles with DateTime在 DateTime 中使用 Moles
【发布时间】:2025-11-23 02:45:01
【问题描述】:

我开始在单元测试中使用 Moles,并且在文档方面有点挣扎。

我想破坏 DateTime.Now。

如果您查看执行此操作的旧方法是添加对 mscorlib 的引用,然后为其添加一个存根文件(添加新项 -> 用于测试的存根和痣)。

“用于测试的 Stubs and Moles”模板已被弃用,您只需右键单击引用并选择“添加 moles 程序集”即可。

VS2010 不允许您直接添加对 mscorlib 的引用,因为我们有对“系统”的引用,这没关系,因为我可以在对象浏览器中看到 DateTime 作为此命名空间的一部分。

如果我为系统引用添加一个 moles 程序集并重建,我仍然无法解析 MDateTime。

有什么建议吗?

【问题讨论】:

    标签: unit-testing moles pex-and-moles


    【解决方案1】:

    对于 mscorlib 的 Moles,您需要直接右键单击测试项目的 References。您将拥有为 mscorlib 添加 Moles 组件。 然后,将 using System.Moles; 添加到您的测试类,因为您需要 Moles of System.DateTime(实际上,您需要更多)。

    [TestMethod()]
    [HostType("Moles")]
    public void DateTimeMolesTest()
    {
        DateTime date = new System.DateTime(2000, 1, 1, 2, 3, 4, 5);
        MDateTime.NowGet = () => date;
        Assert.AreEqual(date, DateTime.Now);
    }
    

    如果你运行这个测试,它会失败,因为你需要添加:

    using Microsoft.Moles.Framework;
    [assembly: MoledType(typeof(System.DateTime))]
    

    那么,你的测试就会成功。 不要忘记 Moles 不能与某些特殊类型的 mscorlib 一起使用。

    【讨论】:

    • 我尝试了“为 mscorlib 添加 Moles 组件”,但是在构建它时给了我数千个错误。由于缺少程序集引用,大多数是类型/命名空间解析错误。有什么想法吗?
    • 这是一个该死的好答案 +1