小编Tim*_*sig的帖子

如何在单元测试中moq一个NetworkStream?

我正在使用Moq和NUnit作为单元测试框架.

我写了一个方法,给出一个NetworkStream对象作为参数:

public static void ReadDataIntoBuffer(NetworkStream networkStream, Queue dataBuffer)
{
  if ((networkStream != null) && (dataBuffer != null))
  {
     while (networkStream.DataAvailable)
     {
        byte[] tempBuffer = new byte[512];

        // read the data from the network stream into the temporary buffer
        Int32 numberOfBytesRead = networkStream.Read(tempBuffer, 0, 512);

        // move all data into the main buffer
        for (Int32 i = 0; i < numberOfBytesRead; i++)
        {
           dataBuffer.Enqueue(tempBuffer[i]);
        }
     }
  } 
  else
  {
     if (networkStream != null)
     {
        throw new ArgumentNullException("networkStream");
     }

     if (dataBuffer …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq mocking networkstream

16
推荐指数
2
解决办法
6175
查看次数

如何使用Moq修改模拟方法的调用参数?

是否可以修改模拟方法的调用参数?特别是我希望buffer将以下示例更改为预先填充的字节数组.

例:
int MockedClass.Read(byte[] buffer, int offset, int count)

说明:
调用Readcount读取offset的字节加载到提供的字节数组中buffer.

现在我希望Read在我的应用程序代码中调用之后填充缓冲区.那可能吗?

如果是的话,我将如何进行连续的通话Read?如果可能的话,我想连续调用每次返回一个不同的缓冲区.

编辑:

使用这样的Setup命令:

MockedClass.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()).Callback( (byte[] buffer, int offset, int count) => buffer[0] = 0xAA);

在执行单元测试时给出了一个奇怪的问题:一旦调用Read并执行委托代码(buffer[0] = 0xAA),调试器就会显示buffer实际上null并且执行此命令后单元测试执行停止.我的语法是borked还是那个bug?

c# unit-testing moq

13
推荐指数
1
解决办法
2991
查看次数

清除不会使用的继承功能是一种好习惯吗?

我想知道是否应该改变我的一个项目的软件架构.

我正在为一个项目开发软件,其中双方(实际上是主机和设备)使用共享代码.这有助于共享数据,例如枚举可以存储在一个中心位置.

我正在使用我们称之为"通道"的设备和主机之间传输数据.每个通道必须在设备和主机端实现.我们有不同类型的通道,普通通道和传输测量数据的特殊通道.

我当前的解决方案在抽象基类中具有共享代码.从那里开始,代码在双方之间分开.事实证明,在某些情况下,当我们共享代码但我们无法共享代码时,我们必须在每一方面实现它.

DRY的原则(不要重复自己)说你不应该有两次代码.

我的想法是现在连接例如设备端的抽象测量通道和具有共享代码的抽象类中的主机端的功能.这意味着,一旦我们为该通道创建设备或主机端的实际类,我们就必须隐藏另一方使用的功能.

这是可以接受的事情:

public abstract class ChannelAbstract
{
    protected void ChannelAbstractMethodUsedByDeviceSide()    {  }
    protected void ChannelAbstractMethodUsedByHostSide()      {  }
}

public abstract class MeasurementChannelAbstract : ChannelAbstract
{
    protected void MeasurementChannelAbstractMethodUsedByDeviceSide()   {  }
    protected void MeasurementChannelAbstractMethodUsedByHostSide()     {  }
}

public class DeviceMeasurementChannel : MeasurementChannelAbstract
{
    public new void MeasurementChannelAbstractMethodUsedByDeviceSide()
    {
        base.MeasurementChannelAbstractMethodUsedByDeviceSide();
    }

    public new void ChannelAbstractMethodUsedByDeviceSide()
    {
        base.ChannelAbstractMethodUsedByDeviceSide();
    }
}

public class HostMeasurementChannel : MeasurementChannelAbstract
{
    public new void MeasurementChannelAbstractMethodUsedByHostSide()
    {
        base.MeasurementChannelAbstractMethodUsedByHostSide();
    }

    public new void ChannelAbstractMethodUsedByHostSide()
    { …
Run Code Online (Sandbox Code Playgroud)

c# architecture oop

9
推荐指数
2
解决办法
167
查看次数

Exception在VS中声明并调试您的C#项目

我们一直在使用NUnit和VisualStudio编写C#.NET代码.测试例外是以样式完成的

旧语法:

[Test]
[ExpectException(typeof(ExceptionType))] 
public void TestExceptionType()
{

}
Run Code Online (Sandbox Code Playgroud)

现在NUnit发布了2.5.2版本,Assert.Throws( Type expectedExceptionType, TestDelegate code );这使得异常测试变得更加灵活.我们的异常测试现在看起来像这样:

新语法:

[Test]
public void TestWithNullBufferArgument()
{
   ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() => _testInstance.TestFunction(null));

   // now you can examine the exception and it's properties
   Assert.AreEqual(ex.Message, "Argument was null");
}
Run Code Online (Sandbox Code Playgroud)

我们的问题是,如果使用Assert.Throws,当使用NUnit(控制台或GUI运行程序)调试程序时,Visual Studio将会触发一个显示未处理异常的窗口.

澄清一下:我们设置了包含单元测试的VS项目,以便在调试时运行nunit-x86.exe.(参见项目属性,调试选项卡,启动操作设置为运行nunit-x86.exe)

这会阻止NUnit继续测试.按F5可以继续调试/单元测试,但这不是一个可行的解决方案.

有什么方法可以避免这种情况吗?在Assert.Throws周围放置一个try ... catch块,因为委托代码中发生异常,所以什么都不做.

我希望有人可以对此有所了解.

c# assert exception nunit-2.5 visual-studio

8
推荐指数
1
解决办法
1669
查看次数

针对接口和实体框架4.0进行编程

我试图弄清楚是否有可能坚持"针对接口而不是实现的程序"的口头禅.使用Entity Framework 4.0时.

虽然我找到了一个页面,解释了如何在使用Linq-to-SQL时坚持上述规则(请看这里),但我非常想知道是否可以使用实体框架(也使用Linq)来实现.

这是它通常使用的方式:

var query = from pages in dataContext.Pages where pages.IsPublished select pages;

foreach (Page page in query)
{
    // do something with page...
    var routeQuery = from routes in page.Route where route.IsValid select routes;

    foreach (Route route in routeQuery)
    {
        // do something with route
    }
}
Run Code Online (Sandbox Code Playgroud)

但我想像这样使用它:

var query = from pages in dataContext.Pages where pages.IsPublished select pages;

foreach (IPage page in query)
{
    // do something with page...
    var routeQuery = from …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework interface entity-framework-4

7
推荐指数
1
解决办法
5229
查看次数

C#如何在运行时动态生成实现不同接口的对象?

我正在研究如何解决问题,我甚至不确定在C#和.NET 3.5中这可能是完全可能的:

假设我的接口数量有限,每个接口都描述一组特定的,不相关的方法.现在我有一些现实世界的设备,每个设备可能只实现这些接口的一个子集.

在使用这些设备建立通信期间,他们会告诉我他们拥有哪些功能.我现在想创建一个实现接口的对象(每个接口类似于设备的一个功能),以便在我的应用程序架构中更高,我能够:

  • 针对上述接口编写代码
  • 测试生成的对象是否实现某个接口以查看是否支持某些操作

我根本不确定使用哪种方法解决这个问题.任何评论或方法最受欢迎!

c# interface dynamic

5
推荐指数
2
解决办法
1349
查看次数

如何在模型更改时更新MVVM嵌套ViewModels,反之亦然?

我正在寻找一些关于如何解决目前困扰我们的问题的建议.

假设我们有几个业务对象(PO​​CO)

public class UserGroup
{
    public virtual ICollection<Person> People { get; set; }
}

public class Person
{
    public virtual ICollection<Adress> Adresses { get; set; }
}

public class Adress
{
    public virtual string StreetName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这有点简单,但我希望它足以让你明白这一点.UserGroup具有Person实例的集合,每个Person实例都有一个Address实例的集合.

UserGroup POCO 的ViewModel 可能如下所示:

public class UserGroupViewModel
{
    private UserGroup userGroupModel;

    public UserGroup UserGroupModel
    {
        get { return this.userGroupModel; }

        set
        {
            this.userGroupModel = value;

            this.PeopleViewModelCollection =
                 new ObservableCollection<PeopleViewModel>();

            foreach …
Run Code Online (Sandbox Code Playgroud)

c# mvvm

5
推荐指数
1
解决办法
2838
查看次数