模拟成员变量

时间:2017-05-24 11:02:52

标签: c# moq

如何模拟类的成员变量?

似乎永远不会调用此FooA()

注意:我是moq的初学者(并且在C#中生锈)所以请耐心等待我; - )

  

未处理的异常:Moq.MockVerificationException:以下内容   设置不匹配:IA a => a.FooA()

以下是源代码:

using Moq;

namespace TestMock
{
    interface IA {
        void FooA();
    }
    class A : IA {
        public void FooA() { }
    }

    class B {
        public void FooB() {
            a.FooA();
        }
        IA a = new A();
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Arrange
            var mockA = new Mock<IA>();
            mockA.Setup(a => a.FooA());
            var mockB = new Mock<B>();

            // Act
            B b = new B();
            b.FooB();

            // Assert
            mockA.VerifyAll();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

原始形式的

updateCheckUrl = updateCheckUrl.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) 与依赖B紧密耦合,这使得在测试时很难进行模拟。

通过构造函数注入重构IA以依赖B。 (Explicit Dependencies Principle

IA

现在在测试中注入模拟的依赖项并验证行为

class B {
    IA a;

    public B(IA a) {
        this.a = a;
    }

    public void FooB() {
        a.FooA();
    }
}