2

問題

コンパイラは、次のメッセージとともに戻り行に警告を表示します。

到達不能コードが検出されました

質問

コンパイラの警告が表示されないように単体テストをリファクタリングするにはどうすればよいですか? 他のフィードバックも大歓迎です。

コード

BarWCF 呼び出しをラップするクラスがあります。呼び出し内のどこかで例外が発生した場合、ラッパーはエラーをログに記録し、WCF エラーをスローします。クラスは次のとおりです。

public class Bar
{
    private readonly ILog _execeptionLog;

    public Bar(ILog execeptionLog)
    {
        if (execeptionLog == null) 
            throw new ArgumentNullException("execeptionLog");

        _execeptionLog = execeptionLog;
    }

    public TResult TryExecute<TResult>(Func<TResult> action)
    {
        if (action == null) 
            throw new ArgumentNullException("action");

        try
        {
            return action.Invoke();
        }
        catch (Exception ex)
        {
            _execeptionLog.Error(ex.ToString());
            var fault = FooFault.CreateFrom(ex);
            throw new FaultException<FooFault>(fault);
        }
    }
}

このクラスの単体テストを試みて、正しい詳細でエラーが発生することを確認します。これが私の単体テスト方法です

[Test]
public void TryExecute_ActionThrowsException_FaultDetailIsNotNull()
{
    //Arrange
    var mock = MockRepository.GenerateMock<ILog>();
    var uut = new Bar(mock);
    var ex = new ArgumentException("foo");

    try
    {
        //Act
        int actual = uut.TryExecute(() =>
        {
            throw ex;
            return 1; //<<<<<<<< Unrechable code detected here
        });
    }
    catch (FaultException<FooFault> fault)
    {
        //Assert
        Assert.IsNotNull(fault.Detail);
    }
}
4

1 に答える 1

1

あなたはこれを行うことができます...

int actual = uut.TryExecute<int>(() =>
{
    throw ex;
    // return 1; //<<<<<<<< Unrechable code detected here
});

そしてこれがいっぱい…

var uut = new Bar(null);
var ex = new ArgumentException("foo");
try
{
    int actual = uut.TryExecute<int>(() =>
    {
        throw ex;
    });
}
catch (Exception fault)
{
    Assert.IsNotNull(fault.Message);
}
于 2013-05-01T11:35:26.760 に答える