1

私は Pex を初めて使用し、DateTime.Now や File.Exists() などのマシン固有のルーチンで使用する方法がわかりません。

タイムゾーンのオフセットでカットオフ DateTime を表示する機能があります。

public class CommonDateTime
{
    public static string ConvertToLongStringWithGmtOffset(DateTime cutoffData)
    {
        return String.Format(
            "{0} {1} GMT (local time is {2})", 
            cutoffData.ToLongDateString(), 
            cutoffData.ToShortTimeString(), 
            DateTime.Now.ToString("zzz"), // here is the problem...
            CultureInfo.InvariantCulture);
    }
}

Pex Explorer によって生成される Pex パラメーター化されたテストがあります。

[PexClass(typeof(CommonDateTime))]
[TestFixture]
public partial class CommonDateTime_Test
{
    /// <summary>Test stub for ConvertToLongStringWithGmtOffset(DateTime)</summary>
    [PexMethod]
    public string ConvertToLongStringWithGmtOffset(DateTime _cutOffData)
    {
        string result = CommonDateTime.ConvertToLongStringWithGmtOffset(_cutOffData);
        return result;
    }
}

ただし、これにより、マシン固有のテストが生成されます。マシンが非 GMT タイムゾーンにある場合は失敗します。

public partial class CommonDateTime_Test
{
    [Test]
    [PexGeneratedBy(typeof(CommonDateTime_Test))]
    public void ConvertToLongStringWithGmtOffset156()
    {
        string s;
        s = this.ConvertToLongStringWithGmtOffset(default(DateTime));
        PexAssert.AreEqual<string>
            ("Monday, January 01, 0001 12:00 AM GMT (local time is +00:00)", s);
    }
}

この状況で何ができますか?DateTime.Now や File.Exists() などの関数を参照する関数の探索をスキップするように指示できますか。または、何らかの形で常に特定のタイムゾーンを使用するように指示できますか?

4

1 に答える 1

3

これがMolesプロジェクトの目的です。のような組み込みの静的関数を含め、基本的に何でもモックできますDateTime.Now

適切な「Moled」コードは次のようになります。

[PexMethod]
public string ConvertToLongStringWithGmtOffset(DateTime _cutOffData)
{
    MDateTime.NowGet = () => /* some value */;

    string result = CommonDateTime.ConvertToLongStringWithGmtOffset(_cutOffData);
    return result;
}

これは、実際にDateTime.Now例として使用する長いチュートリアルです。

于 2011-12-16T01:24:42.837 に答える