2015-10-29 79 views
0

嗨所以我已經創建了一個接口,日期時間是這樣的:的DateTime接口用於單元測試

public interface ITimeProvider<T> 
{ 
    T Now { get; } 
    string ToShortDateString(); 
} 

然後,我有像這樣的接口之一implamentation:

public class DateTimeProvider : ITimeProvider<DateTime> 
{ 

    private DateTime _date; 

    public DateTime Now 
    { 
     get { return DateTime.Now; } 
    } 

    public DateTimeProvider() 
    { 

     _date = new DateTime(); 
    } 
    public string ToShortDateString() 
    { 
     return _date.ToShortDateString(); 
    } 
} 

然後我正在使用它在我的主要單位,並希望使用財產注入,但我遇到了一些問題,這裏是我所擁有的快照:

public class Atm : IAtm 
{ 
    public ITimeProvider _timeProvider { get;set; } 
} 

這不起作用,因爲我沒有指定類型。我可以做

public ITimeProvider<DateTime> _timeProvider { get;set; } 

但是我不能使用另一個timeprovider。我也認爲(和我能想出的唯一解決方案)是讓ATM通​​用的,所以這樣的事情

public class Atm<T> : IAtm 
{ 
     public ITimeProvider<T> _timeProvider { get;set; } 
} 

但後來我覺得我不能使用屬性注入,還有沒有其他的辦法我可以做到這一點,我可以測試它嗎?

+0

「但我遇到了一些問題」。 「不起作用,因爲我沒有指定類型」,但是您已經註冊了我設想的注入容器接口的實現? –

+2

*「但後來我無法使用另一個timeprovider」* - 您是否有可能使用與DateTime'不同的類型來表示日期和時間? – poke

+0

這不是,但我想嘲笑它的測試 – Sumsar1812

回答

1

你抽象的東西是DateTime.Now功能不是DateTime數據類型,你可以保持執行完全一樣的,但剛修好的類型。

public interface ITimeProvider 
{ 
    DateTime Now { get; } 
    string ToShortDateString(); 
} 

public class DateTimeProvider : ITimeProvider 
{ 

    private DateTime _date; 

    public DateTime Now 
    { 
     get { return DateTime.Now; } 
    } 

    public DateTimeProvider() 
    { 
     _date = new DateTime(); 
    } 
    public string ToShortDateString() 
    { 
     return _date.ToShortDateString(); 
    } 
} 


public class RemoteTimeProvider : ITimeProvider 
{ 
    public DateTime Now 
    { 
     get 
     { 
      using(var client = new WebClient()) 
      { 
       var timeString = client.DownloadString(http://www.timeapi.org/utc/now); 
       return DateTime.Parse(timeString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime() 
      } 

     } 
    } 

    public DateTimeProvider() 
    { 

    } 
    public string ToShortDateString() 
    { 
     //ToDo 
    } 
} 

而且,我真的不明白你的ToShortDateString()做什麼,它並不需要一個參數,它僅僅使用從new DateTime()返回的值。

0

使用Fakes能夠在您的控制下對單元測試系統或其他組件而不是

[TestClass] 
public class TestClass1 
{ 
     [TestMethod] 
     public void TestCurrentYear() 
     { 
      int fixedYear = 2000; 

      // Shims can be used only in a ShimsContext: 
      using (ShimsContext.Create()) 
      { 
       // Arrange: 
       // Shim DateTime.Now to return a fixed date: 
       System.Fakes.ShimDateTime.NowGet = 
       () => 
       { return new DateTime(fixedYear, 1, 1); }; 

       // Instantiate the component under test: 
       var componentUnderTest = new MyComponent(); 

       // Act: 
       int year = componentUnderTest.GetTheCurrentYear(); 

       // Assert: 
       // This will always be true if the component is working: 
       Assert.AreEqual(fixedYear, year); 
      } 
     } 
}