【问题标题】:How to moq a class with Get() and Set() methods如何使用 Get() 和 Set() 方法最小化一个类
【发布时间】:2016-03-25 14:57:06
【问题描述】:

我似乎无法最小化具有 getter 和 setter 方法(不是属性)的类。我需要将变量保存在某个地方以便稍后返回。

我班的签名:

public interface IMyClass
{
    int Get();
    void Set(int i);
}

我的真正实现:

  • Set() => 加密 int 并将其保存在局部变量中
  • Get() => 从局部变量中解密 int 并返回 int

我希望最小起订量如何表现:

public class MyClassFake : IMyClass
{
    private int _local;
    public int Get()
    {
        return _local;
    }

    public void Set(int i)
    {
        _local = i;
    }
}

到目前为止我已经尝试过但没有成功:

        var mockMyClass = new Mock<IMyClass>();
        var number = new int();
        mockMyClass.Setup(x => x.Set(It.IsAny<int>())).Callback<int>(x=> number = x);
        mockMyClass.Setup(x => x.Get()).Returns(number);

【问题讨论】:

    标签: c# unit-testing mocking moq stub


    【解决方案1】:

    您必须更改Get() 设置以使用接收Func&lt;&gt; 作为参数的重载:

    var mockMyClass = new Mock<IMyClass>();
    var number = 0;
    mockMyClass.Setup(x => x.Set(It.IsAny<int>())).Callback<int>(x => number = x);
    mockMyClass.Setup(x => x.Get()).Returns(() => number);
    

    在您当前的代码中,您将Get() 结果定义为一个固定数字(初始值为number

    【讨论】:

    • 感谢您的快速回复。我用谷歌搜索了它,但不幸的是我仍然不确定如何重载接收 Func 参数的 Get() 方法。你能举个例子吗?
    • @U.Bulle:对不起,我是说给Returns()打电话:Returns(() =&gt; number);
    • 我有点害怕超载真实类,但它甚至不需要,() =&gt; 做到了。祝阿图罗周末愉快,干杯! :)
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2021-03-19
    相关资源
    最近更新 更多