我正在用NUnit和TestDriven.NET插件编写单元测试.我想为这样的测试方法提供参数:
[TestFixture]
public class MyTests
{
[Test]
public void TestLogin(string userName, string password)
{
// ...
}
...
}
Run Code Online (Sandbox Code Playgroud)
如您所见,这些参数是私有数据,因此我不想对它们进行硬编码或将它们放在文件中.实际上我不想把它们写在任何地方,我希望每次运行测试时都会提示.
当我尝试运行此测试时,我在输出窗口中收到以下消息:
TestCase'MyProject.MyTests.TestLogin'未执行:未提供任何参数
所以我的问题是,我如何提供这些参数?我希望TestDriven.NET显示一个提示符,以便我可以输入值,但它没有...
对不起,如果我的问题看起来很愚蠢,答案可能很简单,但我在Google上找不到任何有用的东西......
编辑:我刚刚找到了办法,但这是一个肮脏的把戏......
[Test, TestCaseSource("PromptCredentials")]
public void TestLogin(string userName, string password)
{
// ...
}
static object[] PromptCredentials
{
get
{
string userName = Interaction.InputBox("Enter user name", "Test parameters", "", -1, -1);
string password = Interaction.InputBox("Enter password", "Test parameters", "", -1, -1);
return new object[]
{
new object[] { userName, password }
};
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然对更好的解决方案感兴趣......
我正在寻找一个内置属性来指定一个类型是不可变的,我只找到了 System.ComponentModel.ImmutableObjectAttribute.
使用Reflector,我检查了它的使用位置,似乎唯一使用它的公共类是System.Drawing.Image ... WTF?它可以用在string,int或任何基本类型上,但Image绝对不是不可变的,有很多方法可以改变它的内部状态(例如使用Graphics或Bitmap.SetPixel方法).
所以BCL中唯一明确声明为不可变的类是可变的!或者我错过了什么?
我正在考虑在即将到来的项目中使用Linq到NHibernate,所以我想要一些关于它的反馈.我在2月份发现了这个相同的问题,看来Linq对NHibernate目前还不是很成熟......从那以后它有所改善吗?有没有人在现实生活中使用它?
感谢您的反馈意见
PS:请不要关闭重复:现有问题差不多1岁,我问的是产品的当前状态......
我被这个System.IO.Directory.GetParent方法的一个非常奇怪的行为击中了脸:
string path1 = @"C:\foo\bar";
DirectoryInfo parent1 = Directory.GetParent(path1);
Console.WriteLine (parent1.FullName); // Prints C:\foo, as expected
// Notice the extra backslash. It should still refer to the same location, right ?
string path2 = @"C:\foo\bar\";
DirectoryInfo parent2 = Directory.GetParent(path2);
Console.WriteLine (parent2.FullName); // Prints C:\foo\bar !!!
Run Code Online (Sandbox Code Playgroud)
我认为它是一个错误,但这种方法自1.0以来一直存在,所以我想现在已经检测到了.另一方面,如果它是按照设计的,我想不出对这种设计的合理解释......
你怎么看 ?这是一个错误吗?如果没有,你如何解释这种行为?
我想知道这些EventInfo.GetRaiseMethod和EventInfo.GetOtherMethods方法.显然,CLR支持4种与事件相关的方法:添加,删除,提升和"其他".但是在C#中创建的事件只有添加和删除 ...我假设在VB中使用了raise,因为你必须RaiseEvent在声明自定义事件时指定一个方法,但显然情况并非如此:GetRaiseMethod始终返回null.
那么,有谁知道:
GetOtherMethods?他们应该做什么?我正在编写一个包含几种常见数据结构(列表,集合,字典......)的专用实现的类库.我发现自己总是一遍又一遍地编写相同的单元测试,我不确定我是不是会忘记测试一些重要的场景.
由于我的课都实现了标准接口(IList<T>,IDictionary<K,V>,等),我想知道是否有某种"参考"的单元测试,这些接口的所有实现应该通过.当然我还需要测试我的类的特定方面,但至少我会更自信我的标准接口的实现没有任何损坏.
请考虑以下代码:
public static void Foo()
{
Bar(null);
}
public static void Bar([NotNull] string s)
{
if (s == null)
throw new ArgumentNullException("s");
}
Run Code Online (Sandbox Code Playgroud)
该[NotNull]属性用于Bar告诉s不应为null的调用者.这工作正常,当我将null传递给Bar(可能'null'赋值给标记为'NotNull'属性的实体时),我收到警告.
但它实际上并没有阻止我传递null,所以Bar仍然必须检查是否s为null.那么为什么我也会收到警告if (s == null)(表达总是假的)?
据我所知,这个属性有一个含糊不清的含义; 根据具体情况,它可能意味着两件事:
我是否正确使用此属性,或者我错过了什么?
顺便说一下,我正在使用Resharper 7 EAP,所以它可能是一个bug; 但是我想在报告之前确保我的用法是正确的...
编辑:刚刚在R#5.1上尝试过同样的事情; 它在呼叫站点上显示警告,但不在方法中显示.我将在Jetbrain的Youtrack上报告.
EDIT2:这里报告错误
.NET Compact Framework引入了可重定向的程序集引用,现在用于支持可移植类库.
基本上,编译器会发出以下MSIL:
.assembly extern retargetable mscorlib
{
.publickeytoken = (7C EC 85 D7 BE A7 79 8E )
.ver 2:0:5:0
}
Run Code Online (Sandbox Code Playgroud)
C#编译器如何理解它必须发出一个可重定向的引用,以及如何强制C#编译器甚至在可移植类库之外发出这样的引用?
我们不能await在catch块中使用关键字这一事实使得在WinRT中显示来自异步方法的错误消息非常尴尬,因为MessageDialogAPI是异步的.理想情况下,我希望能够写下这个:
private async Task DoSomethingAsync()
{
try
{
// Some code that can throw an exception
...
}
catch (Exception ex)
{
var dialog = new MessageDialog("Something went wrong!");
await dialog.ShowAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
但相反,我必须这样写:
private async Task DoSomethingAsync()
{
bool error = false;
try
{
// Some code that can throw an exception
...
}
catch (Exception ex)
{
error = true;
}
if (error)
{
var dialog = new MessageDialog("Something went wrong!");
await …Run Code Online (Sandbox Code Playgroud) TL; DR版本
在写入请求流时发生传输错误时,即使服务器发送了响应,我也无法访问响应.
完整版本
我有一个.NET应用程序,使用它将文件上传到Tomcat服务器HttpWebRequest.在某些情况下,服务器过早地关闭请求流(因为它因某种原因拒绝文件,例如文件无效),并发送带有自定义标头的400响应以指示错误的原因.
问题是,如果上传的文件很大,请求流在我写完请求主体之前关闭,我得到一个IOException:
消息:无法将数据写入传输连接:远程主机强制关闭现有连接.
InnerException ::SocketException远程主机强制关闭现有连接
我可以捕获这个异常,但是当我调用时GetResponse,我得到一个WebException前面IOException的内部异常和一个null Response属性.所以我永远无法得到响应,即使服务器发送它(使用WireShark检查).
由于我无法得到答复,我不知道实际问题是什么.从我的应用程序的角度来看,看起来连接被中断了,所以我将其视为与网络相关的错误并重试上传...当然,这再次失败.
如何解决此问题并从服务器检索实际响应?它甚至可能吗?对我来说,当前的行为看起来像是一个bug HttpWebRequest,或者至少是一个严重的设计问题......
这是我用来重现问题的代码:
var request = HttpWebRequest.CreateHttp(uri);
request.Method = "POST";
string filename = "foo\u00A0bar.dat"; // Invalid characters in filename, the server will refuse it
request.Headers["Content-Disposition"] = string.Format("attachment; filename*=utf-8''{0}", Uri.EscapeDataString(filename));
request.AllowWriteStreamBuffering = false;
request.ContentType = "application/octet-stream";
request.ContentLength = 100 * 1024 * 1024;
// Upload the "file" (just …Run Code Online (Sandbox Code Playgroud) .net ×5
c# ×5
annotations ×1
async-await ×1
clr ×1
events ×1
http ×1
immutability ×1
linq ×1
modal-dialog ×1
nhibernate ×1
notnull ×1
nunit ×1
parameters ×1
resharper ×1
testing ×1
tomcat ×1
try-catch ×1
unit-testing ×1
vb.net ×1