C# Moq Class 带接口

C# Moq Class with Interface

我尝试制作 unit-testing 的 class User

我试着用一个接口来做,但我不明白到底是什么,以及它是否是进行测试的正确方法,所以:

我的ClassUser

public class User : IUser
{
    public int id { get; private set; }
    public string username { get; set; }
    public IUser user;

    public User(IUser userI) // constructor with interface
    {
            user = userI;
    }

    public virtual bool MyFunction(string test)
    {
             if(test=="ping")
                return true;
            else 
                return false;
    }
}

我的界面IUser

public interface IUser
{
    int id { get; }
    string username { get; set; }
}

然后是我的单元测试

[TestFixture]
public class MoqTest
{
    [Test]
    public void TestMyFunction()
    {
        var mock = new Mock<IUser>();
        User user = new User(mock.Object);
        var result = user.MyFunction("ping");
        Assert.That(result, Is.EqualTo(true));
    }
}

测试结果正确,实际returnstrue,但不明白界面的使用方法

基本上,通过模拟,您可以为该接口创建某种虚拟实现。因此,当调用 Mock<IUser>() 时,编译器会生成一个实现接口 IUser 的匿名 class 和 return 这个 class 的新实例。现在,在创建 User-object 时,您会注入该虚拟对象。模拟对象没有任何行为,它的所有成员都设置为它们的默认值,只保证它们 设置为任何值。您还可以更改成员的值 return 但这不会影响您的示例。

这样您就可以测试您感兴趣的方法,而无需实现任何外部依赖项。这可能是必要的,因为您目前没有 IUSer 接口的工作实例并稍后实现它,或者因为它的初始化非常繁重并且您希望避免在测试中初始化它(想想一些数据库逻辑包括不会影响您的实际测试,但需要 运行 测试)。

在您的情况下,您甚至可以使用 new User(null),因为要测试的方法根本不依赖于该接口的实例。所以你根本不需要嘲笑它。