Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以用C语言编写一个单元测试来确保一个方法是';你在项目中什么地方都没打电话?_C#_Unit Testing_Reflection - Fatal编程技术网

C# 有没有一种方法可以用C语言编写一个单元测试来确保一个方法是';你在项目中什么地方都没打电话?

C# 有没有一种方法可以用C语言编写一个单元测试来确保一个方法是';你在项目中什么地方都没打电话?,c#,unit-testing,reflection,C#,Unit Testing,Reflection,在我们的应用程序中,我们强制所有存储为字符串的日期都应该是格式的。例如,如果我们在Lucene索引中存储日期,我希望确保它始终以以下格式存储: 2014-03-12T23:03:13Z 我们有一个扩展方法DateTime.ToISO8601DateTimeString(),可以轻松实现这一点,并围绕现有代码进行单元测试,确保始终如此 但是,我想知道是否可以确保在代码中从不调用DateTime.ToString()(重载除外) 可能的路线: 倒影 SVN中的预提交钩子 重写DateTime.T

在我们的应用程序中,我们强制所有存储为字符串的日期都应该是格式的。例如,如果我们在Lucene索引中存储日期,我希望确保它始终以以下格式存储:

2014-03-12T23:03:13Z
我们有一个扩展方法
DateTime.ToISO8601DateTimeString()
,可以轻松实现这一点,并围绕现有代码进行单元测试,确保始终如此

但是,我想知道是否可以确保在代码中从不调用
DateTime.ToString()
(重载除外)

可能的路线:

  • 倒影
  • SVN中的预提交钩子
  • 重写
    DateTime.ToString()
    ,但出现异常
过去有没有人用类似的方法成功地做到这一点

更新 为了澄清这一点,我希望这是应用程序范围内的,并且如果在使用Moq调用
DateTime.ToString()

的项目中的任何位置添加新代码,则会自动失败(大多数模拟框架都有此功能)

如果你不能模仿你的方法(因为它不是一个接口),你可以尝试使用微软的fakes(moles)来做这项工作

只需在Mole中放置一个assert.Fail,这样,如果调用它,测试就会失败

编辑:正如@Euphoric所说,你应该有一个很好的理由这样做。然而,你可以用摩尔来产生预期的结果。使用MS测试赝品:

using (ShimsContext.Create())
{
   System.Fakes.ShimDateTime.NowGet = () => Assert.Fail("DateTime.Now called");
}

这可能是OT,但我真的认为你不应该这样做

正确的方法是创建
CustomDate
类,该类在应用程序中使用,而不是
DateTime
。如果您确保应用程序不能接受
DateTime
,并且
CustomDate
使用您想要的转换,则无需进行任何类型的测试

请注意,此代码不会触发您的测试,但会带来以下问题:

DateTime now = DateTime.Now;
String str = "now is :"+now;

你在用什么样的模拟框架?你可以用Moles:为什么不设计你的代码,这样就不可能用其他方式保存它呢?此外,您不能这样做,因为每当您尝试以字符串的形式访问字符串时,都会隐式调用ToString,因此不必显式调用ToString,就可以很容易地获取字符串的日期值。@Phill我们将Moq与NUnit一起使用。@jgauffin我第一次听说Moles,它看起来很有希望,我会做一些研究。谢谢Jorge;我更新了我的问题,以澄清这需要是一个项目范围的检查。编辑以提供答案。注意,使用moles是有效的,但如果你有充分的理由(例如,如果你想让你永远不调用DateTime。现在,因为你有自己的方法来使用NodaTime)。我同意这条消息。阅读问题的更新后。别这样!听快乐的!我同意一个人不应该不考虑就这样做,但我不同意一个人永远不应该这样做。毕竟,正是您正在使用的“CustomDate”示例,您需要添加一个mole,以便任何对DateTime.Now的调用都会产生一个失败(受控),从而确保每个人都在使用CustomDate而不是DateTime。Now@JorgeC奥多巴,你不明白。在任何地方使用DateTime都应该是很好的,除了您希望使用特定格式的地方。期望使用特定格式的位置应仅接受CustomDate。对我来说,强制特定使用类的需要似乎真的是糟糕的设计代码味道。你是对的,我认为他想完全禁止使用DateTime,而不是禁止使用“toString”@Click Rex。重点是确保每次存储日期时,都将其存储为CustomDate,而不是字符串。您的问题源于您以非类型安全的方式存储数据。因此,要确保可以绑定到类型的特定规则并不容易。您试图解决的是症状,而不是问题的原因。
DateTime now = DateTime.Now;
String str = "now is :"+now;