DateTimeOffset类型的mock属性会导致Windows Store测试库中的InvalidProgramEx

本文关键字:测试 Store InvalidProgramEx Windows mock 类型 属性 DateTimeOffset | 更新日期: 2023-09-27 18:09:21

我刚开始使用Windows Store应用程序,并决定在我的项目中使用测试驱动开发。因为我之前有过使用NUnit的经验,这是我选择的库,然后我开始使用MoqRT,这是一个网站推荐的用于Windows Store应用程序的mock库。

我面临的问题是,当我嘲笑一个对象,有一个DateTimeOffset作为属性的类型。我收到以下异常:

系统。InvalidProgramException:公共语言运行库检测到无效程序
在Castle.Proxies.ITimeProxy_1.get_Expires ()

stacktrace的剩余部分由于清晰度而被删除

现在,当我在属性上使用DateTimeOffset类型时,只会出现,并且mock(例如字符串属性)工作得非常好。

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类型属性的接口,而不会引发异常?

DateTimeOffset类型的mock属性会导致Windows Store测试库中的InvalidProgramEx

你不能使用Moq与Windows Store运行时,因为winrt不允许动态代码生成。

我这样做只是想创建一个简单的。net框架库,它引用了我所有的代码,我想测试,从Win Store项目

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