我有一个使用枚举的类,枚举当前在它自己的文件中,这看起来很浪费.
将枚举放在文件命名空间中的一般意见是什么?或者枚举真的应该存在于自己的cs文件中吗?
编辑
我应该提一下,虽然有问题的类使用这些枚举,但外部调用者也是如此.换句话说,另一个类可以设置这些枚举.因此,他们不会在课堂内部使用,否则这个问题将毫无疑问.
在我的测试项目中无法访问System.Diagnostics.Contracts.ContractException.请注意,这段代码纯粹是我自己搞乱了我的Visual Studio新副本,但我想知道我做错了什么.
我正在使用VS的专业版,因此我没有静态检查.为了仍然使用代码契约(我喜欢),我认为我的方法可以工作的唯一方法是捕获在运行时抛出的异常,但我发现这不可能.
测试方法
[TestMethod, ExpectedException(typeof(System.Diagnostics.Contracts.ContractException))]
public void returning_a_value_less_than_one_throws_exception()
{
var person = new Person();
person.Number();
}
Run Code Online (Sandbox Code Playgroud)
方法
public int Number()
{
Contract.Ensures(Contract.Result<int>() >= 0);
return -1;
}
Run Code Online (Sandbox Code Playgroud)
错误
Error 1 'System.Diagnostics.Contracts.ContractException' is inaccessible due to its protection level.
编辑
经过一番思考后,我得出了评论中讨论的结论,以及以下内容.给定一种方法,如果这有一个可以用代码合同形式表达的要求,我会写这样的测试.
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void value_input_must_be_greater_than_zero()
{
// Arrange
var person = new Person();
// Act
person.Number(-1);
}
Run Code Online (Sandbox Code Playgroud)
这将确保合同是代码的一部分,并且不会被删除.这将要求Code Contract实际抛出指定的异常.但在某些情况下,不需要这样做.
/// <summary>
/// This method does something...
/// </summary>
public void DoSomething()
{
// code...
}
Run Code Online (Sandbox Code Playgroud)
当使用该方法/类等...在不同的.dll中时,注释不会显示.
例如,本文介绍了它们.
有什么好处?
静态分析似乎很酷,但同时它会阻止在单元测试中传递null作为参数的能力.(如果您按照文章中的示例进行操作)
关于单元测试的主题 - 如果您已经实施自动化测试,那么现在肯定没有任何关系可以代码合同吗?
更新
玩过代码合约后,我有点失望.例如,根据接受的答案中的代码:
public double CalculateTotal(Order order)
{
Contract.Requires(order != null);
Contract.Ensures(Contract.Result<double>() >= 0);
return 2.0;
}
Run Code Online (Sandbox Code Playgroud)
对于单元测试,您仍然必须编写测试以确保无法传递null,并且如果契约是业务逻辑,则结果大于或等于零.换句话说,如果我要删除第一个合同,除非我特意测试了这个功能,否则没有测试会中断.这是基于不使用内置于Visual Studio的更好(终极等)版本中的静态分析.
目前我有:
[Test]
public void DrawDrawsAllScreensInTheReverseOrderOfTheStack() {
// Arrange.
var screenMockOne = new Mock<IScreen>();
var screenMockTwo = new Mock<IScreen>();
var screens = new List<IScreen>();
screens.Add(screenMockOne.Object);
screens.Add(screenMockTwo.Object);
var stackOfScreensMock = new Mock<IScreenStack>();
stackOfScreensMock.Setup(s => s.ToArray()).Returns(screens.ToArray());
var screenManager = new ScreenManager(stackOfScreensMock.Object);
// Act.
screenManager.Draw(new Mock<GameTime>().Object);
// Assert.
screenMockOne.Verify(smo => smo.Draw(It.IsAny<GameTime>()), Times.Once(),
"Draw was not called on screen mock one");
screenMockTwo.Verify(smo => smo.Draw(It.IsAny<GameTime>()), Times.Once(),
"Draw was not called on screen mock two");
}
Run Code Online (Sandbox Code Playgroud)
但是我在生产代码中绘制对象的顺序并不重要.我可以先做一个,或者两个没关系.然而,它应该重要,因为绘制顺序很重要.
你如何(使用Moq)确保按特定顺序调用方法?
编辑
我摆脱了那个考验.draw方法已从我的单元测试中删除.我只需要手动测试它的工作原理.尽管顺序的逆转被带入了一个单独的测试类,在那里测试它并不是一件坏事.
感谢您关注的功能链接.我当然希望它能很快得到补充,非常方便.
我在很多地方都读过"吸气鬼和恶魔都是邪恶的".我理解为什么这样.但我不知道如何完全避免它们.Say Item是一个包含项目名称,数量,价格等信息的类......而ItemList是一个类,它有一个Items列表.要找到总计:
int grandTotal()
{
int total = 0;
for (Item item: itemList)
total += item.getPrice();
return total;
}
在上面的例子中,如何避免getPrice()?Item类提供了getName,setName等....
我该如何避免它们?
// Remove element with ID of 1
var userIds = from user in document.Descendants("Id")
where user.Value == "1"
select user;
userIds.Remove();
SaveAndDisplay(document);
// Add element back
var newElement = new XElement("Id", "0",
new XElement("Balance", "3000"));
document.Add(newElement);
SaveAndDisplay(document);
Run Code Online (Sandbox Code Playgroud)
add元素后块是个问题.当它到达添加时它表明:
此操作将创建结构不正确的文档.
我犯的是什么愚蠢的错误?
编辑:
是的,我是在读XDocument,而不是XElement.关于何时支持其中一个的任何建议?
所以我的公司使用Castle Windsor IoC容器,但感觉"关闭":
设计系统的人坚持认为IoC容器使系统更好.我们有1200多个公共类,所以它是一个很大的系统,你期望找到像Windsor这样的框架.但我仍然持怀疑态度.
我的公司是否有效地使用IoC?使用Windsor的新对象比使用new关键字的新对象更有优势吗?
所以关于来自SO和其他互联网站点的日志记录,最佳响应似乎是:
void DoSomething() {
Logger.Log("Doing something!");
// Code...
}
Run Code Online (Sandbox Code Playgroud)
现在通常你会避免静态方法,但在记录(特殊情况)的情况下,这是最简单和最干净的路线.在静态类中,您可以通过配置文件/框架轻松注入实例,以获得与DI相同的效果.
我的问题来自单元测试的角度.
在上面的示例代码中,想象DoSomething()的意思是将两个数字加在一起.我会为这个罚款写单元测试.伐木怎么样?
我是否会为日志记录编写单元测试(但是对于记录器本身使用模拟实例)?我知道如果是这种情况我将不得不编写一个集成测试来证明记录器实际写入日志文件,但我不确定.
在测试驱动开发之后(我这样做)我需要进行单元测试才能决定接口没有?
有什么建议?
c# ×5
unit-testing ×3
.net ×2
.net-4.0 ×2
accessor ×1
client-side ×1
coding-style ×1
enums ×1
javascript ×1
linq-to-xml ×1
logging ×1
moq ×1
ooad ×1
oop ×1
properties ×1
tdd ×1
xml ×1