我刚开始使用 Windows Store 应用程序,并决定在我的项目中使用测试驱动开发。由于我之前对 NUnit 有过一些经验,因此我选择了这个库,然后我开始使用 MoqRT,它是一个网站推荐的模拟库,作为用于 Windows 应用商店应用程序的模拟库。
我面临的问题是当我模拟一个具有 aDateTimeOffset
作为属性类型的对象时。我收到以下异常:
System.InvalidProgramException:公共语言运行时在 Castle.Proxies.ITimeProxy_1.get_Expires()检测到无效程序...由于清晰而删除了堆栈跟踪的其余部分
现在,这只发生在我DateTimeOffset
在属性上使用类型时,并且模拟例如字符串属性可以很好地工作。
using System;
using Moq;
using NUnit.Framework;
namespace StoreTesting
{
[TestFixture]
public class UnitTest1
{
[Test]
public void TestMethod1()
{
// Mock
DateTimeOffset expirydate = DateTimeOffset.UtcNow.AddSeconds(2000);
var time = new Mock<ITime>();
time.Setup(m => m.Expires).Returns(expirydate);
// Act
TimeDependant obj = new TimeDependant(time.Object);
var result = obj.Act();
// Assert
Assert.That(result, Is.EqualTo(expirydate));
}
}
public class TimeDependant
{
private readonly ITime time;
public TimeDependant(ITime time)
{
this.time = time;
}
public DateTimeOffset Act()
{
return time.Expires;
}
}
public interface ITime
{
DateTimeOffset Expires { get; }
}
}
如果我继承ITime
并使用它而不是 Mock,一切都很好。
在搜索这个时,似乎异常的主要问题与“方法太大”有关,但是看到这仅发生在类型的属性上,DateTimeOffset
我看不出这会如何影响我的测试,因为其他属性应该失败以及是否与此有关。
另一件事是我正在使用 NUnit 应用程序运行测试,因为测试不会在 Visual Studio 2012 中运行,因为它是 Windows Store 应用程序(这是另一个问题)。我不知道这是否也会影响行为。
我要问的问题是;DateTimeOffset
有没有办法在不引发异常的情况下模拟具有类型属性的接口?