使用Moq,我希望能够验证传递给模拟方法调用的参数是否满足某些条件.在这种情况下,我想检查传递给mocked方法的列表是否具有一定的大小:
var mockSomeRepository = new Mock<SomeRepository>();
mockSomeRepository.Setup(m => m.Write(It.IsAny<List<SomeDTO>>())).Verifiable();
var mainClass = new MainClass(mockSomeRepository.Object);
List<SomeDTO> someList = GetListWith25Items();
mainClass.DoRepositoryWrite(someList); // calls SomeRepository.Write(someList);
mockSomeRepository.Verify(m =>
m.Write(It.Is<List<SomeDTO>>(l => l.Count() == 25)), Times.Once());
Run Code Online (Sandbox Code Playgroud)
验证断言抛出一个异常,表示永远不会以这种方式调用该方法.但是,删除约束并使用Is.Any<List<SomeDTO>>()相反会导致传递.我不确定我是否在这里使用It.Is <>() - 这是我直觉地希望我的测试看起来像但我不确定我是否正确使用框架.我应该如何正确地构建这个测试?
可能重复:
C#从指数表示法中解析一个数字
我目前有:
decimal value = Decimal.Parse(dataRow["column"].ToString());
Run Code Online (Sandbox Code Playgroud)
后端中有一些数据采用科学记数法(即3.2661758893885E-05),并且在解析时导致FormatException.是否有捷径可寻?
我正在编写一个控制台应用程序,它可以从存储过程记录集中进行大量数据检索.对于我正在使用的每个记录集类型,我有一个使用EF和自定义复杂类型的Repository来检索数据:
public interface IBalanceSheetRepository
{
IEnumerable<BalanceSheetRecordDTO> GetBalanceSheetRecords();
}
public class BalanceSheetRepository : IBalanceSheetRepository
{
DBContext _context;
...
public IEnumerable<BalanceSheetRecordDTO> GetBalanceSheetRecords()
{
ObjectResult<BalanceSheetRecord> results = _context.GetBalanceSheet();
return results.Select(CreateBalanceSheetDTOFromDAO);
}
private static BalanceSheetRecordDTO CreateBalanceSheetDTOFromDAO(BalanceSheetRecord dao)
{
return new BalanceSheetRecordDTO { ... };
}
}
Run Code Online (Sandbox Code Playgroud)
这BalanceSheetRecord是我在设计器中创建的复杂数据类型.我创建了一个DTO以避免耦合,因为BLL不应该知道BalanceSheetRecord类型.
这是我的问题:由于DTO类型用于存储库接口的方法签名,并且由于我的BLL最终将使用存储库并返回DTO的集合,因此它似乎是一个跨领域的问题.因此,我让DTO与repo接口一起生活在一个单独的"Infrastructure"组件中.这是我努力实现的良好做法,还是我在某个地方转错了?
另外:在我的存储库中新建数据上下文是不好的做法?当两个组件都属于DAL时,是否有一定量的耦合?我想使用DI,但是对于例如交换repo的DBContext实现似乎更有用TestBalanceSheetRepository.
所以我完全重构了构造函数注入,现在我有一个类似于这个的bootstrapper类:
var container = new UnityContainer();
container.RegisterType<Type1, Impl1>();
container.RegisterType<Type2, Impl2>();
container.RegisterType<Type3, Impl3>();
container.RegisterType<Type4, Impl4>();
var type4Impl = container.Resolve((typeof)Type4) as Type4;
type4Impl.Run();
Run Code Online (Sandbox Code Playgroud)
我盯着它看了一会儿才意识到Unity对我来说真的没什么特别的.离开ctor sigs,上面的内容可以写成:
Type1 type1Impl = Impl1();
Type2 type2Impl = Impl2();
Type3 type3Impl = Impl3(type1Impl, type2Impl);
Type4 type4Impl = Impl4(type1Impl, type3Impl);
type4Impl.Run();
Run Code Online (Sandbox Code Playgroud)
构造函数注入重构很棒,真正打开了代码的可测试性.但是,我在这里怀疑Unity的用处.我意识到我可能以有限的方式使用框架(即不在任何地方注入容器,使用代码而不是XML进行配置,而不是利用生命周期管理选项),但是我没有看到它在这个示例中实际上是如何帮助的.我已经阅读了不止一条评论,他认为DI最好只用作模式,没有容器.这是一个很好的例子吗?这个解决方案提供了哪些其他好处,我错过了?
进入项目属性对话框后,左侧有一个垂直的选项卡列表(应用程序,构建,构建事件等).是否有任何已知的键盘快捷键将循环通过它们?
我正在使用一种方法,该方法会对传递的参考参数造成副作用.我对代码的主要关注点之一是可读性,这种情况我觉得可能导致混淆.
举个例子:
class Program
{
static void Main(string[] args)
{
var simplePOCO = new SimplePOCO();
// Method 1: causes side effects, but potentially unclear
Method1(simplePOCO);
// Method 2: assignment makes intentions clearer, but unnecessary
simplePOCO = Method2(simplePOCO);
// Method 3: ref/out makes intentions clearer, but (very?) unnecessary
Method3(ref simplePOCO);
// Method 4: avoid the problem altogether
simplePOCO.SimpleProperty = Method4();
}
public static void Method1(SimplePOCO simplePOCO)
{
simplePOCO.SimpleProperty = 1;
}
public static SimplePOCO Method2(SimplePOCO simplePOCO)
{
simplePOCO.SimpleProperty = 1;
return …Run Code Online (Sandbox Code Playgroud)