尝试使用 Mock时 Moq 出现奇怪的问题对于泛型类型

发布于 2024-12-08 11:18:14 字数 829 浏览 0 评论 0原文

一些代码:

public interface IMyInterface
{
    int GetIt();
}

public class MyImplementation : IMyInterface
{
    public int GetIt()
    {
        return 10;
    }
}

   [Test]
    public void Testit()
    {
        Method<MyImplementation>();
    }

    private void Method<T>()
        where T : class , IMyInterface
    {
        var mock = new Mock<T>();
        mock.Setup(m => m.GetIt()).Returns(() =>
                                               {
                                                   return 40;
                                               });

        Assert.AreEqual(40, mock.Object.GetIt());
    }

请注意,在新建 Mock 时,我使用的是通用 T,但是由于 T 被限制为引用类型和 IMyInterface 类型,因此我可以毫无问题地设置方法。但由于某种原因,它总是失败,并调用 MyImplementation 的实际实现,而不是 Mocked 的实现。

A bit of code:

public interface IMyInterface
{
    int GetIt();
}

public class MyImplementation : IMyInterface
{
    public int GetIt()
    {
        return 10;
    }
}

   [Test]
    public void Testit()
    {
        Method<MyImplementation>();
    }

    private void Method<T>()
        where T : class , IMyInterface
    {
        var mock = new Mock<T>();
        mock.Setup(m => m.GetIt()).Returns(() =>
                                               {
                                                   return 40;
                                               });

        Assert.AreEqual(40, mock.Object.GetIt());
    }

Notice that when newing up the Mock I'm using the generic T, however since T is constrained to being a reference type and of type IMyInterface, I can set up the methods no problem. For some reason though, it always fails, and calls the actual implementation of MyImplementation as opposed to the Mocked one.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

-小熊_ 2024-12-15 11:18:14

您本质上是在模拟类方法,因此该方法必须是虚拟的。

尝试

public class MyImplementation : IMyInterface
{
    public virtual int GetIt()
    {
        return 10;
    }
}

You are essentially mocking a class method and for that the method has to be virtual.

Try

public class MyImplementation : IMyInterface
{
    public virtual int GetIt()
    {
        return 10;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文