有没有办法检查模拟是否已为成员设置?

Joh*_*son 10 c# moq

我需要这样做:

if(!fooMock.HasSetupFor(x => x.Bar))
{
    fooMock.Setup(...);
}
Run Code Online (Sandbox Code Playgroud)

以上是伪代码,它相当于HasSetupFor我正在寻找.这可能吗?

Joh*_*nny 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)