小编Ben*_*ins的帖子

如何正确模拟和单元测试

我基本上都在努力教自己如何编码,我想遵循良好的做法.单元测试有明显的好处.在单元测试方面也有很多狂热,我更喜欢更实用的编码和生活方法.作为上下文,我正在编写我的第一个"真实"应用程序,它是使用asp.net MVC的无处不在的博客引擎.我通过自己的调整松散地遵循MVC店面架构.因此,这是我第一次真正涉足嘲弄对象.我将把代码示例放在问题的最后.

我很感激任何洞察力或外部资源,我可以用它来增加我对测试和模拟基础的理解.我在网上找到的资源通常是针对模拟的"方式",我需要更多地了解模拟的地点,原因和时间.如果这不是提出这个问题的最佳地点,请指出一个更好的地方.

我试图理解我从以下测试中获得的价值.UserService依赖于IUserRepository.服务层的价值是将逻辑与数据存储分开,但在这种情况下,大多数UserService调用只是直接传递给IUserRepository.没有太多实际逻辑需要测试的事实也可能是我担忧的根源.我有以下问题.

  • 感觉就像代码只是在测试模拟框架是否正常工作.
  • 为了模拟依赖关系,它使我的测试对IUserRepository实现有太多的了解.这是一个必要的邪恶吗?
  • 我从这些测试中获得了什么价值?被测服务的简单性是否让我怀疑这些测试的价值.

我正在使用NUnit和Rhino.Mocks,但我应该很清楚我要完成的事情.

    [SetUp]
    public void Setup()
    {
        userRepo = MockRepository.GenerateMock<IUserRepository>();
        userSvc = new UserService(userRepo);
        theUser = new User
        {
            ID = null,
            UserName = "http://joe.myopenid.com",
            EmailAddress = "joe@joeblow.com",
            DisplayName = "Joe Blow",
            Website = "http://joeblow.com"
        };
    }

    [Test]
    public void UserService_can_create_a_new_user()
    {
        // Arrange
        userRepo.Expect(repo => repo.CreateUser(theUser)).Return(true);

        // Act
        bool result = userSvc.CreateUser(theUser);

        // Assert
        userRepo.VerifyAllExpectations();
        Assert.That(result, Is.True, 
          "UserService.CreateUser(user) failed when it should have succeeded");
    }

    [Test]
    public void UserService_can_not_create_an_existing_user()
    {
        // Arrange
        userRepo.Stub(repo …
Run Code Online (Sandbox Code Playgroud)

unit-testing mocking

24
推荐指数
3
解决办法
9377
查看次数

如何正确转换通过反射创建的对象

我试图围绕反射,所以我决定将插件功能添加到我正在编写的程序中.理解一个概念的唯一方法是让你的手指变脏并编写代码,所以我选择了创建一个由IPlugin和IHost接口组成的简单接口库,一个实现IPlugin的类的插件实现库,以及一个简单的接口库.实例化IHost实现类的控制台项目,该类实现了插件对象的简单工作.

使用反射,我想迭代我的插件实现dll中包含的类型并创建类型的实例.我能够使用此代码成功实例化类,但我无法将创建的对象强制转换为接口.

我尝试了这段代码,但我无法像我预期的那样投射对象o.我使用调试器完成了整个过程,并调用了正确的构造函数.快速查看对象o向我展示了它具有我期望在实现类中看到的字段和属性.

loop through assemblies
  loop through types in assembly
    // Filter out unwanted types
    if (!type.IsClass || type.IsNotPublic || type.IsAbstract )
      continue;
    // This successfully created the right object
    object o = Activator.CreateInstance(type);
    // This threw an Invalid Cast Exception or returned null for an "as" cast
    // even though the object implemented IPlugin      
    IPlugin i = (IPlugin) o;
Run Code Online (Sandbox Code Playgroud)

我使用这个代码.

using System.Runtime.Remoting;
ObjectHandle oh = Activator.CreateInstance(assembly.FullName, type.FullName);
// This worked as I intended
IPlugin i = (IPlugin) oh.Unwrap(); …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection

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

您会向初学者推荐哪些编程专业领域

我是一名学习软件开发的学生,我觉得编程一般来说太过广泛,无法尝试了解所有内容.要精通,你必须决定哪些领域要集中你的学习和理解.某些技能组合相互协作,如数据驱动的Web开发和SQL体验.但是,世界上所有的win32 API体验可能都不会直接适用于linux开发.这让我相信,作为一名初级程序员,在对软件开发的基本原理有一般了解之后,我应该开始决定我想要专攻的地方.

这是一个多部分的问题:

  1. 计算机编程和软件开发中的常见专业是什么?
  2. 这些专业中哪一项具有更长远的价值,既可作为其他专业化的基础和/或作为适销对路的技能?
  3. 哪种技能相互补充?
  4. 是否有任何专业领域妨碍您开发其他专业领域的能力.

language-agnostic

8
推荐指数
2
解决办法
7705
查看次数

.net托管内存如何处理对象内的值类型?

public class MyClass
{
    public int Age;
    public int ID;
}

public void MyMethod() 
{
    MyClass m = new MyClass();
    int newID;
}
Run Code Online (Sandbox Code Playgroud)

据我了解,以下是真实的:

  1. 当MyMethod()退出时,引用m存在于堆栈上并超出范围.
  2. 值类型newID存在于堆栈中,并在MyMethod()退出时超出范围.
  3. 当MyMethod()退出时,由new运算符创建的对象存在于堆中并由GC回收,假设不存在对该对象的其他引用.

这是我的问题:

  1. 对象中的值类型是否存在于堆栈或堆上?
  2. 对象中的装箱/取消装箱值类型是否值得关注?
  3. 关于这个主题,是否有任何详细但可理解的资源?

从逻辑上讲,我认为类中的值类型会在堆中,但我不确定是否必须将它们装入盒中.

编辑:

建议阅读本主题:

  1. CLR通过C#by Jeffrey Richter
  2. Don Box的Essential .NET

.net memory

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

对于NHibernate的V1.2,"NHibernate in Action"这本书在2009年10月仍然有用吗?

10美元,曼宁正在以"NHibernate in Action"为特色. NHibernate In Action于2009年2月发布,用于NHibernate的V1.2.目前,NHibernate达到V2.1.关于V1.2的书是否足以适用于当前版本的NHibernate.我不想浪费我的时间和金钱在一本关于弃用或不相关的功能的书上.

我是一个完整的NHibernate noob,但我对ORM的一般概念并不陌生.

更新:

我确实买了这本书,从我读过的少量书中,V2.x系列在本书发布时处于测试阶段.本书的作者确实指出了1.x和2.x之间的一些配置差异.从我到目前为止所读到的内容,我向任何想要一本关于NHibernate的书的人推荐这本书.

nhibernate

4
推荐指数
1
解决办法
287
查看次数