通过Stack Overflow上的现有单元测试相关线程读取,我找不到一个有关如何单元测试文件I/O操作的明确答案.我最近才开始研究单元测试,之前已经意识到了这些优点,但是很难习惯先编写测试.我已经设置了我的项目来使用NUnit和Rhino Mocks,虽然我理解它们背后的概念,但我在理解如何使用模拟对象方面遇到了一些麻烦.
具体来说,我有两个问题需要回答.首先,单元测试文件I/O操作的正确方法是什么?其次,在我尝试学习单元测试时,我遇到了依赖注入.在Ninject设置和工作之后,我想知道我是否应该在单元测试中使用DI,或者直接实例化对象.
我正在为我无法控制的库编写类型声明文件。其中一个方法接受一个字符串数组作为参数,但这些字符串只能是非常具体的值。目前我正在将此参数输入为 a string[],但我想知道是否有办法增强它以包含特定值。
示例源(我无法更改):
Fruits(filter) {
for (let fruit of filter.fruits)
{
switch(fruit)
{
case 'Apple':
...do stuff
case 'Pear':
...do stuff
default:
console.error('Invalid Fruit');
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我当前的类型声明:
function Fruits(filter: FruitFilter): boolean;
interface FruitFilter {
fruits: string[];
}
Run Code Online (Sandbox Code Playgroud)
在我写这个问题时,我想出了一个部分解决方案,即定义有效字符串的联合类型,然后将该字段的类型设置为该联合的数组而不是字符串数组。这给了我想要的检查,但我注意到如果你输入一个无效的字符串,它会将数组中的所有字符串标记为无效,并显示错误Type 'string' is not assignable to type 'Fruit'。有没有更好的方法来做到这一点,以便只有违规的字符串被标记为无效,或者这与我将要得到的一样接近?
部分解决方案:
function Fruits(filter: FruitFilter): boolean;
type Fruit = 'Apple' | 'Pear'
interface FruitFilter {
fruits: Fruit[];
}
Run Code Online (Sandbox Code Playgroud) 在我目前正在进行的数据结构类中,我们的任务是使用C++编写Web爬虫.为了给我们一个良好的开端,教授为我们提供了一个程序,用于从给定的URL获取源代码,并使用简单的HTML解析器来剥离标记.该程序的主要功能接受参数,因此使用argc/argv.用于检查参数的代码如下:
// Process the arguments
if (!strcmp(option, "-h"))
{
// do stuff...
}
else if (!strcmp(option, ""))
{
// do stuff...
}
else if (!strcmp(option, "-t"))
{
// do stuff...
}
else if (!strcmp(option, "-a"))
{
// do stuff...
}
if ( *argv == NULL )
{
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
其中"选项"已用argv [1]中的开关填充,而argv [2]和更高版本具有剩余参数.我理解的第一个块就好了,如果开关等于字符串做什么基于开关.我想知道最后一个if块的目的是什么.
可能是我的C++有点生疏,但我似乎记得*argv等同于argv [0],基本上意味着它正在检查以确保参数存在.除了我的印象是argv [0]总是(至少在大多数实现中)包含正在运行的程序的名称.我发现如果argc等于0,argv [0]可能为null,但是在Google上搜索我找不到确定是否可能的单个帖子.
所以我转向你.如果块检查,那究竟是什么?
编辑:我已经使用了所选答案的注释中提供的推理,有可能故意导致argv [0]变为NULL,或者基于特定于平台的main实现变为NULL.
我最近开始使用LuaInterface来让Lua脚本在我的C#程序中运行.为了从Visual Studio中轻松创建Lua脚本,我安装了一个Lua语法高亮插件并创建了一个项模板,这样我就可以通过右键单击项目文件并选择"New Item-> Lua Script"来创建新脚本.这非常有效.
为了让程序找到脚本,需要将它们放在构建位置的同一目录(或子目录)中.这正是我想要的地方,但为了做到这一点,我必须为我创建的每个新文件更改"复制到输出目录"设置.
有没有办法更改此选项的默认设置?现在它默认为"不要复制".我只能找到另一个问题基本上是同一个问题,但是那里提供的唯一答案是建议将构建后事件复制到具有相同扩展名的所有文件到定义的位置.我真的不想这样做,因为目标目的地可能会改变或者可能会添加更多目标(并且需要额外的事件?),我希望能够在每个文件的基础上更改该设置.
这只是一个方便的问题,因为我可以手动为每个文件更改该选项,但是已经能够自动执行其余的过程,我希望我也可以自动完成最后一个细节.
在开发WinForms应用程序时,我遇到了我认为是OpenFileDialog和SaveFileDialog控件中的错误.谷歌搜索发现了另一个注意到相同问题的人,但没有提供解决方案或解决方法.您可以在以下网址查看此主题:http://bytes.com/topic/visual-basic-net/answers/389470-open-file-dialog-picturebox-click-event.
我的表单上有一个自定义控件来处理MouseDown事件.如果我在鼠标悬停在此控件上时双击FileDialog控件中的文件(显然它们之间有对话框),则会触发MouseDown事件.我不认为这是我控制的问题,因为我之前提到过的人注意到这是用PictureBox控件发生的.即使在对话框中按下鼠标按钮(第二次单击以打开文件),当对话框关闭时,事件也会传递到窗体和我的控件.
我已经尝试在对话框处于活动状态时禁用我的控件,但这并没有阻止它捕获事件.我认为这是因为事件在对话框关闭后传递下来,所以我的控件将被重新启用.有没有人知道一种方法来防止点击到达表格,反过来,我的控制?此外,任何人都可以确认这是否真的是FileDialog控件中的错误,或者我是否只是错误地设置了一些设置?
我最近选择了 Microsoft Office Visio 2010,以便绘制出我正在计划的软件应用程序的执行流程。到目前为止,我很喜欢这个程序,它极大地帮助我在开始编码之前就弄清楚该程序需要哪些交互和事件。然而,我对该软件有一个抱怨,当我向图表中添加新元素时,Visio 倾向于尝试尽可能频繁地组合路线。这有时会导致很难准确地看到某些路线所指向的位置。例如:
示例1:
示例2:
在示例 1 中,您可以看到有 3 条路由,每条路由都有不同的标签。最初,这些标签也会相互重叠。我发现可以在“页面布局”对话框中关闭此功能,因此它比以前好一点,但路线的起点和终点仍然组合在一起。这实际上并不是一个问题,但可能如示例 2 所示。
示例 2 中的位置是什么?从左边进来的线指向底部的菱形,然后有 3 条路线从菱形的顶部出来。这就是我要解决的问题。这些示例中没有显示,但在示例 2 中将标签放在这三个路线上会将标签全部放在垂直方向上,这使得无法分辨哪个标签对应于哪条线。
有没有办法防止线条像这样重叠?我已经充分探索了“页面设置”对话框,但那里的可用选项似乎都不允许这种行为。我在网上找到的唯一解决方案是手动绘制所有路线,但这意味着我无法使用“重新布局页面”功能,而且如果 Visio 决定经常这样做,这可能会相当耗时。
更新:在尝试更多设置来尝试找到解决方案时,我想出了一个很好的例子,展示了这会变得多么糟糕。现在,这是一个极端的例子,如果您的图表看起来像这样,您可能做错了,但它清楚地表明,很快就无法分辨每条线的源和目的地是什么。
来自主要的C#背景,我使用ReSharper多年.能够将光标放在未解析的引用上,按Alt + Enter,并选择一个选项来添加相应的using语句是非常宝贵的.现在,Visual Studio 2017本身具有此功能!有了这个(以及VS2017中添加的许多其他功能),我摆脱了ReSharper并享受着非常快速且响应迅速的Visual Studio体验.
我最近开始用C++做一些工作,虽然我从Intellisense得到有关字段和方法的建议,但是当涉及到未解析的引用时,它并没有建议任何标题#include.
我的问题是Visual Studio 2017是否添加了该功能来建议#includeC++的选项?在浏览之后,似乎Visual Assist X和ReSharper C++都有这个功能,但我找不到任何详细说明此功能现在是否可用(如果是,我如何启用它?)或者它是否仍然是一个扩展专属.
c++ intellisense visual-assist resharper-c++ visual-studio-2017
我正在使用 log4j 2.11 作为其日志记录框架的 Java 解决方案。我还使用了一个极其频繁地使用特定 POJO 的库。我希望能够将该对象直接传递到日志语句中log.debug("POJO: %s", pojo),但遗憾的是该对象没有实现 toString 并且我无法修改库代码。
据我所知,log4j 1.x 通过 ObjectRenderer 解决了这个问题。您可以实现 ObjectRenderer,然后在 log4j.properties 文件中定义一行
log4j.renderer.com.library.Pojo=com.project.PojoRenderer,然后 log4j 将调用您的渲染器来提供该字符串值。
根据https://logging.apache.org/log4j/2.x/manual/compatibility.html,但似乎此功能并未纳入log4j2。是否有一个等效的功能可以用来直接记录它,而不必求助于包装器或辅助方法?
我正在 GitHub Pages 上构建 Jekyll 站点。我有一个需要一点 JavaScript 的特定页面。此页面的标题和正文标签由我使用的主题控制。我想在一个外部脚本文件中维护这个 JavaScript,而不是在我的页面中间使用原始脚本。
鉴于现代网络技术,简单地使用异步脚本标签加载文件有什么主要问题吗?一旦页面生成,这个标签就会出现在正文内容中,但据我所知,在正文中不加载外部脚本的建议最初来自加载速度问题,并且对于 async 不再有效。该脚本很小并且控制非关键功能。
基本上:
<body>
...page content...
<script src="/assets/js/myscript.js" type="text/javascript" async=""></script>
...page content...
</body>
Run Code Online (Sandbox Code Playgroud)
我可以覆盖主题布局以直接访问标题并更传统地执行此操作,但如果可能,我想避免这种情况。在 Jekyll 中使用小型一次性脚本还有其他建议吗?
在我的桌面上,如果我没有明确设置存储库的用户和电子邮件,git 将抛出一个错误,指出它无法自动检测我的电子邮件地址,并将停止我的提交。鉴于我在许多不同的存储库上工作,并且希望每个存储库都有不同的作者/电子邮件设置,我非常喜欢这个功能。
我知道发生这种情况是因为我的用户/电子邮件未配置。我不是在问如何解决这个错误。相反,我想知道是否有可能,如果可以,如何配置 git 永远不会自动检测我的电子邮件地址?
在我的笔记本电脑上它会自动检测。然后我配置我的用户/电子邮件,但随后必须修改我的提交。如果我没有配置我的用户/电子邮件,我希望它拒绝我的提交。
一些同事和我一直在使用Eclipse查看SVN中的分支.到目前为止,我们一直在使用Subversive,但我们无法获得一致的结果.有时候我们会遇到冲突,有时我们不会发生冲突,有时它只看到一半文件的变化等.
我一直在尝试使用Subclipse,并且每次都能按照我们想要的方式执行一致的结果.切换到Subclipse的唯一原因是我们目前使用Subversive ProjectSets来设置我们的工作区.
我已经读过Subversive可以阅读Subclipse生成的ProjectsSets,但看起来情况正好相反.有没有办法让Subversive使用Subclipse创建ProjectSet?或者我们是否必须使用Subclipse重新创建ProjectSet?
c# ×2
c++ ×2
argv ×1
arrays ×1
asynchronous ×1
automation ×1
c ×1
double-click ×1
eclipse ×1
file-io ×1
filedialog ×1
flowchart ×1
git ×1
github-pages ×1
intellisense ×1
java ×1
javascript ×1
jekyll ×1
layout ×1
line ×1
log4j ×1
log4j2 ×1
logging ×1
mouseevent ×1
ms-office ×1
null ×1
nunit ×1
pojo ×1
properties ×1
script-tag ×1
subclipse ×1
subversive ×1
svn ×1
typescript ×1
union-types ×1
unit-testing ×1
visio ×1
winforms ×1