如何设置Moq以执行Moq的某些方法

Jas*_*ans 3 moq

我有一个传递像这样的对象的测试:

var repo = new ActualRepo();

var sut = new Sut(repo);
Run Code Online (Sandbox Code Playgroud)

在我的测试中,Repo有一个我需要实际执行的方法,而另一个我想模拟而不执行的方法。

因此,例如,使用以下伪代码:

var repo = new Mock<IRepo>();

repo.Setup(m => m.MethodIWantToCall()).WillBeExecuted();
repo.Setup(m => m.MethodIWantToMock()).Returns(false);
Run Code Online (Sandbox Code Playgroud)

使用最小起订量,这有可能吗?如何完成?

编辑:我过去使用过TypeMock,您可以做类似的事情。

Isolator.When(() => repo.MethodToIgnore()).WillBeIgnored();
Isolator.When(() => repo.MethodToActuallyRun()).WillBeExecuted();
Run Code Online (Sandbox Code Playgroud)

Ala*_*anT 5

从这个问题不太确定这是否有用,但是如果要模拟的方法是virtual,则可以部分模拟对象。

public class Foo {
    public string GetLive() {
        return "Hello";
    }

    public virtual string GetMock() {
        return "Hello";
    }
}

public class Snafu {
    private Foo _foo;
    public Snafu(Foo foo) {
      _foo = foo;
    }

    public string GetMessage() {
        return string.Format("{0} {1}", _foo.GetLive(), _foo.GetMock());
    }
}


[TestMethod]
public void NotMocked() {
    var snafu = new Snafu(new Foo());
    Assert.AreEqual("Hello Hello", snafu.GetMessage());
}


[TestMethod]
public void Mocked() {

    var mockFoo = new Mock<Foo>();
    mockFoo.Setup(mk => mk.GetMock()).Returns("World");

    var snafu = new Snafu(mockFoo.Object);

    Assert.AreEqual("Hello World", snafu.GetMessage());
}
Run Code Online (Sandbox Code Playgroud)