问题列表 - 第21684页

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

用Moq模拟扩展方法

我有一个预先存在的界面......

public interface ISomeInterface
{
    void SomeMethod();
}
Run Code Online (Sandbox Code Playgroud)

并且我使用mixin扩展了这个表面...

public static class SomeInterfaceExtensions
{
    public static void AnotherMethod(this ISomeInterface someInterface)
    {
        // Implementation here
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个叫这个我要测试的课程...

public class Caller
{
    private readonly ISomeInterface someInterface;

    public Caller(ISomeInterface someInterface)
    {
        this.someInterface = someInterface;
    }

    public void Main()
    {
        someInterface.AnotherMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

和测试,我想模拟界面并验证对扩展方法的调用...

    [Test]
    public void Main_BasicCall_CallsAnotherMethod()
    {
        // Arrange
        var someInterfaceMock = new Mock<ISomeInterface>();
        someInterfaceMock.Setup(x => x.AnotherMethod()).Verifiable();

        var caller = new Caller(someInterfaceMock.Object);

        // Act
        caller.Main();

        // Assert
        someInterfaceMock.Verify();
    }
Run Code Online (Sandbox Code Playgroud)

然而,运行此测试会产生异常......

System.ArgumentException: …
Run Code Online (Sandbox Code Playgroud)

c# extension-methods unit-testing moq mocking

153
推荐指数
6
解决办法
9万
查看次数

TDD:"仅测试"方法

在这里寻找一些实用的建议以及人们在类似情况下的任何经验.

我们使用BDD/TDD sytle方法来构建我们的软件(相当大/复杂的应用程序)最终结果是......从业务需求派生的行为规范(Given/When/Then style),反映这些的单元测试和反映的代码测试的要求.

但是,最近我们的测试部门已经开始运行集成测试,可以理解的是他们希望使用我们(已经通过的)业务逻辑代码来建立和拆除测试状态(而不是直接处理数据库),因为他们主要关注通过应用程序的UI进行测试,不想花一整天的时间来争论数据库.

问题是,某些实体存储库没有删除方法,因为还没有针对这些方法表达业务需求.许多人有存档/恢复/备份等(并且可能在待办事项上有删除待处理).

所以现在我们有一个测试部门.删除要求(但与业务用户故事冲突的要求)

所以......我的问题是......如果我要为测试部门专门添加方法......那么处理这些方法的最佳方法是什么.我知道这在"TDD乌托邦"中通常被认为是不好的做法,但实际上,你是如何处理这种冲突的?

我的第一个想法是使用命名...

void TestOnly_Delete(Guid id){} 
Run Code Online (Sandbox Code Playgroud)

... ...属性

[TestOnly]
void Delete(Guid id){}
Run Code Online (Sandbox Code Playgroud)

......或编译器指令......

#if TESTBUILD
void Delete(Guid id){}
#endif
Run Code Online (Sandbox Code Playgroud)

因此,开发人员至少可以知道不要调用TestOnly方法,并且最多不会在生产版本中部署测试方法.

...或者只是作弊并添加一个用户故事来管理它;-)

任何经验或建议感激不尽?

提前致谢.

architecture tdd bdd integration-testing naming-conventions

14
推荐指数
1
解决办法
357
查看次数

Visual Studio 2010和boost :: bind

我有这个使用boost :: bind的简单代码:

#include <boost/bind.hpp>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<int> a;
    std::vector<std::pair<bool,int> > b;

    a.push_back(1);
    a.push_back(2);
    a.push_back(3);

    std::transform(a.begin(), a.end(), std::back_inserter(b),
                   boost::bind(std::make_pair<bool, int>, false, _1));
}
Run Code Online (Sandbox Code Playgroud)

我在VS2010 RC中遇到了大量错误,例如:

Error   1   error C2780: 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type> boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided c:\projects\testtuple\main.cpp  18  
Error   2   error C2780: 'boost::_bi::bind_t<Rt2,boost::_mfi::cmf8<R,T,B1,B2,B3,B4,B5,B6,B7,B8>,_bi::list_av_9<A1,A2,A3,A4,A5,A6,A7,A8,A9>::type> boost::bind(boost::type<T>,R (__thiscall T::* )(B1,B2,B3,B4,B5,B6,B7,B8) const,A1,A2,A3,A4,A5,A6,A7,A8,A9)' : expects 11 arguments - 3 provided   c:\projects\testtuple\main.cpp  18
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?如果这是编译器中的错误,我该如何解决它?

编辑:添加了整个测试用例.

澄清:代码在VS2008中编译.

c++ boost visual-studio-2010

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

在J2SE中"关闭"弹簧上下文的正确方法

我目前在J2SE应用程序中遇到JPATransactionManager的问题.

最新的请求未正确保存在数据库中(肯定是缓存问题).

这似乎是正常的,因为程序的退出似乎并没有"干净地"退出Spring应用程序上下文的所有Bean.

你知道在退出之前是否有一种干净关闭Spring上下文的方法?

先感谢您.

java spring

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

Java中的非大写常量

这个关于为什么Java中的常量按惯例大写的问题让我试着想一下反例.

我能想到至少一个(Double.NaN).还有其他人吗?

java constants naming-conventions

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

requestRouteToHost IP参数

为了检查设备上的互联网访问,我使用requestRouteToHost函数,但它的第二个参数有整数类型 - 我必须放入什么?它是[1]函数的IP视图吗?我认为使用默认的android函数有更简单的方法.有人能告诉我吗?

[1] - >

public static Long ipToInt(String addr) {
        String[] addrArray = addr.split("\\.");

        long num = 0;
        for (int i=0;i<addrArray.length;i++) {
            int power = 3-i;

            num += ((Integer.parseInt(addrArray[i])%256 * Math.pow(256,power)));
        }
        return num;
    }
Run Code Online (Sandbox Code Playgroud)

谢谢.

android

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

有条件地在列表中包含元素的最佳方法是什么?

可能的方法:

  1. 使用推送:

    my @list;  
    push @list, 'foo' if $foo;  
    push @list, 'bar' if $bar;  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用条件运算符:

    my @list = (  
        $foo ? 'foo' : (),    
        $bar ? 'bar' : (),              
    );
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用x!!布尔列表squash运算符:

    my @list = (  
        ('foo') x!! $foo,  
        ('bar') x!! $bar,  
    );  
    
    Run Code Online (Sandbox Code Playgroud)

哪一个更好,为什么?

perl list operators

7
推荐指数
2
解决办法
230
查看次数

检索存储在MySQL表中的文章的第一句

我需要使用MySQL显示数据库中每篇文章的第一句(直到第一个句号).

有人可以帮帮我吗?

mysql

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

反复使用git-filter-branch重写新的提交

我想将使用更大应用程序分发的模块拆分为单独的子模块,并保持从上游拉出的能力.

所以这比Detach子目录更复杂到单独的Git存储库.我不仅一次使用git-filter-branch,而且希望在我完成之后保持上拉变量的能力(而上游没有).

只需在我的重写历史未发现上游现在包括新提交完整的历史重新运行git的过滤分支是不是一种选择,因为有数百个模块为此我不得不这样做,提交的数目越来越接近100.000 .

我猜这涉及将历史限制为新的提交,重写那些然后在之前重写的提交之后添加它们,但我不确定如何做到这一点 - 也许有更好的方法.

如果分支和标签也可以被保留,那将是很好的,但这不是绝对必要的,如果它使事情变得复杂,我实际上宁愿失去那些.

git git-filter-branch

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