首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有接口的C# Moq类

具有接口的C# Moq类
EN

Stack Overflow用户
提问于 2016-03-16 14:25:04
回答 1查看 3.1K关注 0票数 0

我试着做一个unit-testingUser

我试图用一个接口来完成这个任务,但是我并不完全理解什么是什么,以及它是否是进行测试的正确方法,所以:

我的班User

代码语言:javascript
复制
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

代码语言:javascript
复制
public interface IUser
{
    int id { get; }
    string username { get; set; }
}

然后我的单元测试

代码语言:javascript
复制
[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));
    }
}

测试结果是正确的,并且实际上返回true,但不理解使用接口的方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-16 14:28:53

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36038492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档