1

我刚开始使用 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有没有办法在不引发异常的情况下模拟具有类型属性的接口?

4

1 回答 1

0

据我所知,您不能将 Moq 与 Windows Store Runtime 一起使用,因为winrt 不允许动态 codegen

我这样做只是想创建一个简单的 .NET Framework 库,它引用了我想要测试的所有代码,来自 Win Store Project

如何使用 Moq 和 nUnit 为 Windows 运行时库编写单元测试

于 2013-04-14T17:27:30.400 回答