我需要为我们的应用程序运行集成/回归测试套件,并且应用程序应该在一天中的不同时间表现不同。我无法改变系统时间,因为其他应用程序依赖它我想为此目的模拟DateTime.Now。但是,当我将模拟放在main方法中时,会抛出异常。当我在同一个应用程序的nunit测试中使用模拟时,它工作正常。 typemock只能在单元测试的上下文中使用吗?无论如何我可以在启用模拟的情况下运行解决方案吗? 我也通过TMockRunner.exe运行解决方案,但遇到了同样的问题。
谢谢!
当我使用Travis提到的方法运行时,我看到了这个错误 @Travis Illig,包装器的代码是:
class Program
{
static void Main(string[] args)
{
ExpectationsSetup();
ConsoleApplication2.Program.Main(args);
}
public static void ExpectationsSetup()
{
Isolate.WhenCalled(() => DateTime.Now).WillReturn(new DateTime(2010, 1, 2));
}
}
I see the following error:
Unhandled Exception: TypeMock.TypeMockException:
*** No method calls found in recording block. Please check:
* Are you trying to fake a field instead of a property?
* Are you are trying to fake an unsupported mscorlib type? See supported types
here: http://www.typemock.com/mscorlib-types
at gt.a(c0 A_0, Boolean A_1)
at bg.a(Boolean A_0)
at dt.b(Boolean A_0)
at i2.b(Boolean A_0)
at i2.a(Object A_0, Boolean A_1, Func`1 A_2, Action A_3, Action A_4, Action A
_5, Boolean A_6)
at i2.b(Object A_0)
at TypeMock.ArrangeActAssert.ExpectationEngine`1.a(TResult A_0)
at ConsoleApplication2Mock.Program.ExpectationsSetup() in C:\Users\shvenkat\D
ocuments\Visual Studio 2010\Projects\ConsoleApplication2\ConsoleApplication2Mock
\Program.cs:line 22
at ConsoleApplication2Mock.Program.Main(String[] args) in C:\Users\shvenkat\D
ocuments\Visual Studio 2010\Projects\ConsoleApplication2\ConsoleApplication2Mock
\Program.cs:line 14
任何帮助将不胜感激 谢谢!
答案 0 :(得分:0)
Typemock Isolator的典型用途是在单元测试或小型测试环境中。在一个进程中运行Isolator(或任何其他基于探测器的产品,如NCover)有一个非零的开销,所以你通常不希望这样做。
但是,当你真的想在常规进程上运行Isolator时,总有一些边缘情况,这是可能的。
基本算法成立:
第一步很简单 - 就像你在单元测试环境中运行它一样。这是第二步可能很困难。这意味着您需要拥有某种“包装器”或在您的应用程序的其余部分允许启动之前运行的东西,这将设置您的期望。这通常发生在测试设置方法或“arrange-act-assert”单元测试的“安排”部分。 You'll see an example of this in my article.
再一次,我会警告你性能。在你提到你正在做的测试环境中做这样的事情可能很好,但我认为我不会在生产中这样做。
有关您的计划和您所看到的错误的具体说明:
我试图设置它的复制品,虽然我能够模仿其他东西,但我无法获得DateTime.Now嘲笑工作。 我遇到了同样的异常。
例如,在你的包装器中试试这个:
class Program
{
static void Main(string[] args)
{
ExpectationsSetup();
ConsoleApplication2.Program.Main(args);
}
public static void ExpectationsSetup()
{
// Mock something OTHER than DateTime.Now - this mocks
// the call to your wrapped application.
Isolate
.WhenCalled(() => ConsoleApplication2.Program.Main(null))
.DoInstead(ctx => Console.WriteLine("faked!"));
}
}
通过TMockRunner.exe运行该包装器,您实际上可以使模拟工作。但是,将其切换回DateTime.Now,您将再次获得异常。
我确实在单元测试环境中模拟DateTime.Now 确实有效。所以单元测试环境必须有一些特别之处,尽管我不知道是什么。
确定差异比这里可以处理的东西更深入一些。 你应该联系Typemock支持并说明情况。他们非常擅长帮忙。请务必向他们发送复制品(例如,显示问题的简单控制台应用),您将获得更快/更好的响应。