2015-10-29 40 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); 
      } 
     } 
}