1
public class MyClass: AbstractBase
{
    public override bool Init(IAppContext contextIn)
    {
        if (base.Init(contextIn))
        {
            //my code 
        }
    }
}

上記のようなクラスがあり、Init メソッドの単体テストを書きたいと思い、IAppContext. モックを使用してベースへの呼び出しをバイパスするにはどうすればよいですか?

これは私がやっていることです:

Mock<IAppContext> mockContex = new Mock<IAppContext >();
MyClass myClassInstance - new MyClass ();
myClassInstance.Init(mockContex.object);

次のbase.initようになります。

public virtual bool Init(IAppContext context_in) 
{
    if (context_in == null)
    {
        throw new ArgumentNullException("context_in", "IAppContext argument s null"); 
    } 
    this.myCommunication = context_in.getInterface<ICommunication>();
    if (this.myCommunication == null)
    { 
        throw new ArgumentNullException("myCommunication", "ICommunication argument is null");
    } 
    this.myStateManager = new IStateManager(this.myCommunication);
    if (this.myStateManager == null)
    { 
        throw new InvalidOperationException("Could not create the State Manager");
    }
    return true; 
} 
4

1 に答える 1

1

true を返すIAppContextようにモックをセットアップできます。base.Init

var communicationFake = new Mock<ICommunication>();
var appContextMock = new Mock<IAppContext>();

appContextMock
    .Setup(c => c.getInterface<ICommunication>())
    .Returns(communicationFake.Object);

で呼び出されるとbase.Initが返されるようになりました。trueappContextMock

最後の null チェック ( ) は必要ないことに注意してください。失敗するthis.myStateManager == null唯一の方法はnew IStateManager(this.myCommunication)、例外をスローすることです。もしそうなら、とにかくnullチェック部分にはなりません。

于 2012-05-09T08:17:59.707 に答える