小编Tho*_*que的帖子

如何使用TestDriven.NET指定测试方法参数?

我正在用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)

我仍然对更好的解决方案感兴趣......

testing parameters nunit testdriven.net

12
推荐指数
2
解决办法
1万
查看次数

如何使用ImmutableObjectAttribute?

我正在寻找一个内置属性来指定一个类型是不可变的,我只找到了 System.ComponentModel.ImmutableObjectAttribute.

使用Reflector,我检查了它的使用位置,似乎唯一使用它的公共类是System.Drawing.Image ... WTF?它可以用在string,int或任何基本类型上,但Image绝对不是不可变的,有很多方法可以改变它的内部状态(例如使用Graphics或Bitmap.SetPixel方法).

所以BCL中唯一明确声明为不可变的类可变的!或者我错过了什么?

.net immutability

12
推荐指数
2
解决办法
1630
查看次数

Linq对NHibernate:它成熟了吗?

我正在考虑在即将到来的项目中使用Linq到NHibernate,所以我想要一些关于它的反馈.我在2月份发现了这个相同的问题,看来Linq对NHibernate目前还不是很成熟......从那以后它有所改善吗?有没有人在现实生活中使用它?

感谢您的反馈意见

PS:请不要关闭重复:现有问题差不多1岁,我问的是产品的当前状态......

linq nhibernate linq-to-nhibernate

12
推荐指数
0
解决办法
1995
查看次数

Directory.GetParent中的错误?

我被这个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以来一直存在,所以我想现在已经检测到了.另一方面,如果它是按照设计的,我想不出对这种设计的合理解释......

你怎么看 ?这是一个错误吗?如果没有,你如何解释这种行为?

.net base-class-library

12
推荐指数
1
解决办法
2605
查看次数

.NET事件特殊方法(添加/删除/提升/其他)

我想知道这些EventInfo.GetRaiseMethodEventInfo.GetOtherMethods方法.显然,CLR支持4种与事件相关的方法:添加,删除,提升和"其他".但是在C#中创建的事件只有添加删除 ...我假设在VB中使用了raise,因为你必须RaiseEvent在声明自定义事件时指定一个方法,但显然情况并非如此:GetRaiseMethod始终返回null.

那么,有谁知道:

  • 如果一个事件从未被使用过,那么与一个事件相关联的加法方法有什么意义呢?是否有使用此方法引发事件的特定MSIL指令?(我在操作码中找不到类似的东西)
  • 什么是"其他"方法返回(好吧,实际上没有返回)GetOtherMethods?他们应该做什么?
  • BCL中有哪些类型可以实现这些特殊方法?

.net c# vb.net clr events

12
推荐指数
1
解决办法
1588
查看次数

参考单元测试常见数据结构?

我正在编写一个包含几种常见数据结构(列表,集合,字典......)的专用实现的类库.我发现自己总是一遍又一遍地编写相同的单元测试,我不确定我是不是会忘记测试一些重要的场景.

由于我的课都实现了标准接口(IList<T>,IDictionary<K,V>,等),我想知道是否有某种"参考"的单元测试,这些接口的所有实现应该通过.当然我还需要测试我的类的特定方面,但至少我会更自信我的标准接口的实现没有任何损坏.

.net c# unit-testing

12
推荐指数
1
解决办法
444
查看次数

需要澄清Resharper NotNullAttribute的含义

请考虑以下代码:

    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)(表达总是假的)

据我所知,这个属性有一个含糊不清的含义; 根据具体情况,它可能意味着两件事:

  • 对于调用者:不传递null参数
  • 对于被调用者:此参数不为null

我是否正确使用此属性,或者我错过了什么?

顺便说一下,我正在使用Resharper 7 EAP,所以它可能是一个bug; 但是我想在报告之前确保我的用法是正确的...


编辑:刚刚在R#5.1上尝试过同样的事情; 它在呼叫站点上显示警告,但不在方法中显示.我将在Jetbrain的Youtrack上报告.


EDIT2:这里报告错误

resharper annotations notnull

12
推荐指数
1
解决办法
2106
查看次数

C#编译器如何决定发出可重定向的程序集引用?

.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#编译器甚至在可移植类库之外发出这样的引用?

c# compiler-construction portable-class-library

12
推荐指数
1
解决办法
1080
查看次数

在异步方法中显示错误消息的更好方法

我们不能awaitcatch块中使用关键字这一事实使得在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)

c# modal-dialog try-catch async-await windows-runtime

12
推荐指数
1
解决办法
1860
查看次数

如何在传输期间关闭请求流时获取HTTP响应

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 c# tomcat http httpwebrequest

12
推荐指数
1
解决办法
3181
查看次数