有没有一种方法可以检查模拟对象是否为成员设置了设置项?

11

我有需要去做:

if(!fooMock.HasSetupFor(x => x.Bar))
{
    fooMock.Setup(...);
}

上面是伪代码,等效于我正在寻找的HasSetupFor。这可能吗?


那将非常有用,可以扩展该库! - Crono
1个回答

1
这可能需要使用MockBehavior.Strict。我创建了概念证明。
    [TestClass]
    public class UnitTest1
    {
        public interface ITestInterface
        {
            int Bar { get; set; }
            void Foo(int foo);
        }


        [TestMethod]
        public void TestMethod1()
        {
            Mock<ITestInterface> mock = new Mock<ITestInterface>(MockBehavior.Strict);
            mock.Setup(a => a.Foo(3));
            mock.Setup(a => a.Bar)
                .Returns(3);


            bool t1 = mock.HasSetupFor((m) => m.Foo(3));
            bool t2 = mock.HasSetupFor((m) => m.Bar);
        }
    }

    public static class MockExtension
    {
        public static bool HasSetupFor<T>(this Mock<T> value, Action<T> expression) where T : class
        {
            if (value.Behavior != MockBehavior.Strict)
                throw new InvalidOperationException("Behaviour must be strict");

            bool hasSetup = true;

            try
            {
                expression(value.Object);
            }
            catch(MockException)
            {
                hasSetup = false;
            }

            return hasSetup;
        }

        public static bool HasSetupFor<TMock, TResult>(this Mock<TMock> value, Func<TMock, TResult> expression) where TMock : class
        {
            if (value.Behavior != MockBehavior.Strict)
                throw new InvalidOperationException("Behaviour must be strict");

            bool hasSetup = true;

            try
            {
                TResult tmp = expression(value.Object);
            }
            catch (MockException)
            {
                hasSetup = false;
            }

            return hasSetup;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接