C# 如何在一个服务上测试一个方法,同时在同一个服务上模拟另一个方法?

C# 如何在一个服务上测试一个方法,同时在同一个服务上模拟另一个方法?,c#,moq,C#,Moq,假设我有服务: UserService 它有两种公共方法: Method1, Method2 我正在测试Method1,但是Method1调用了Method2 我如何模拟(或者stub是更正确的词)对Method2的调用 如果我模拟UserService,那么我现在就不能真正测试Method1了,可以吗?除非您通过引入抽象/接口来削弱这些方法之间的耦合,否则这是无法做到的。您当前的UserService实现意味着Method1和Method2之间存在强耦合。除非您通过引入抽象/接口来削弱这些

假设我有服务:

UserService
它有两种公共方法:

Method1, Method2
我正在测试Method1,但是Method1调用了Method2

我如何模拟(或者stub是更正确的词)对Method2的调用


如果我模拟UserService,那么我现在就不能真正测试Method1了,可以吗?

除非您通过引入抽象/接口来削弱这些方法之间的耦合,否则这是无法做到的。您当前的UserService实现意味着Method1和Method2之间存在强耦合。

除非您通过引入抽象/接口来削弱这些方法之间的耦合,否则无法实现这一点。您当前的UserService实现意味着Method1和Method2之间存在着很强的耦合。

我仍然在努力解决这个问题,“我应该模拟对Method2的调用吗?”我倾向于说,“不”。如果类在内部使用这两个方法作为其逻辑的一部分,那么这两个方法都是测试的一部分。mock用于依赖于
UserService
,而不是内部实现细节


简而言之,虽然我不知道有任何模拟工具可以做到这一点,但我认为首先不应该这样做。

我仍然在努力解决这个问题,“我应该模拟对Method2的调用吗?”我倾向于说,“不”。如果类在内部使用这两个方法作为其逻辑的一部分,那么这两个方法都是测试的一部分。mock用于依赖于
UserService
,而不是内部实现细节


简言之,虽然我不知道有什么模仿工具可以做到这一点,但我认为首先不应该这样做。

你不能使用Moq。你可以考虑使用摩尔,它确实提供了这种粒度。如果您在自己的程序集上Mole,您可以在方法/属性级别而不是在类/接口级别进行mock。

您不能使用Moq。你可以考虑使用摩尔,它确实提供了这种粒度。如果您在自己的程序集上进行模拟,则可以在方法/属性级别而不是在类/接口级别进行模拟。

如果我正确理解您的问题,您可以使用:

如果没有期望覆盖成员,则调用基类实现(在Rhino Mocks中称为“部分Mocks”)

使用
CallBase=true
创建模拟,设置
Method2
以返回您想要测试的任何值,然后调用
Method1

例如:

class Program
{
    static void Main(string[] args)
    {
        var mock = new Mock<UserService> { CallBase = true };
        mock.Setup(m => m.Method2()).Returns("Mock 2");

        Console.WriteLine(mock.Object.Method1());
        Console.ReadLine();
    }
}

public class UserService
{
    public virtual string Method1()
    {
        return "Method 1 :: " + Method2();
    }

    public virtual string Method2()
    {
        return "Method 2";
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var mock=new mock{CallBase=true};
Setup(m=>m.Method2()).Returns(“mock 2”);
WriteLine(mock.Object.Method1());
Console.ReadLine();
}
}
公共类用户服务
{
公共虚拟字符串Method1()
{
返回“方法1::”+Method2();
}
公共虚拟字符串方法2()
{
返回“方法2”;
}
}

如果我正确理解您的问题,您可以使用:

如果没有期望覆盖成员,则调用基类实现(在Rhino Mocks中称为“部分Mocks”)

使用
CallBase=true
创建模拟,设置
Method2
以返回您想要测试的任何值,然后调用
Method1

例如:

class Program
{
    static void Main(string[] args)
    {
        var mock = new Mock<UserService> { CallBase = true };
        mock.Setup(m => m.Method2()).Returns("Mock 2");

        Console.WriteLine(mock.Object.Method1());
        Console.ReadLine();
    }
}

public class UserService
{
    public virtual string Method1()
    {
        return "Method 1 :: " + Method2();
    }

    public virtual string Method2()
    {
        return "Method 2";
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var mock=new mock{CallBase=true};
Setup(m=>m.Method2()).Returns(“mock 2”);
WriteLine(mock.Object.Method1());
Console.ReadLine();
}
}
公共类用户服务
{
公共虚拟字符串Method1()
{
返回“方法1::”+Method2();
}
公共虚拟字符串方法2()
{
返回“方法2”;
}
}

我希望测试集中在方法1上,我已经对方法2进行了测试。我希望测试集中在方法1上,我已经对方法2进行了测试。