Tag: tdd

C# – 在unit testing中断言两个对象是相同的

使用Nunit或Microsoft.VisualStudio.TestTools.UnitTesting。 现在我的断言失败了。 [TestMethod] public void GivenEmptyBoardExpectEmptyBoard() { var test = new Board(); var input = new Board() { Rows = new List() { new Row(){Cells = new List(){0,0,0,0}}, new Row(){Cells = new List(){0,0,0,0}}, new Row(){Cells = new List(){0,0,0,0}}, new Row(){Cells = new List(){0,0,0,0}}, } }; var expected = new Board() { Rows = new List() […]

AutoMockContainer,支持具有非接口依赖性的自动锁定类

我有一个具有非接口依赖的构造函数: public MainWindowViewModel(IWorkItemProvider workItemProvider, WeekNavigatorViewModel weekNavigator) 我正在使用Moq.Contrib automockcontainer。 如果我尝试自动锁定MainWindowViewModel类,由于WeekNavigatorViewModel依赖项,我收到错误。 是否有任何automocking容器支持非接口类型的模拟? 正如马克在下面所示; 是的你可以! :-)我将Moq.Contrib AutoMockContainer替换为Mark在他的答案中提出的东西,唯一的区别是自动生成的模拟被注册为单例,但你可以使这个可配置。 这是最终的解决方案: /// /// Auto-mocking factory that can create an instance of the /// class under test and automatically inject mocks for all its dependencies. /// /// /// Mocks interface and class dependencies /// public class AutoMockContainer { readonly IContainer _container; public […]

如何在C#中测试COM依赖对象

我试图用一个依赖于COM接口的对象来做TDD。 我虽然在进行开发测试时嘲笑COM接口,但在集成测试中做到了真实。 但是,我无法模拟COM接口,我尝试使用Moq,并抛出exception: 用户代码未处理System.TypeLoadException消息=无法从程序集“DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null”加载类型“Castle.Proxies.iTunesAppProxy”。 该类型被标记为符合类型等效,但它具有通用参数,或者它不是结构,COM导入的接口,枚举或委托 是否可以与其他框架一起使用? 你如何使用COM依赖对象进行TDD? 在此先感谢!或代表

使用Moqvalidation参考参数的值

我刚刚切换到Moq并遇到了问题。 我正在测试一个创建业务对象的新实例的方法,从用户输入值设置对象的属性,并调用方法(SaveCustomerContact)来保存新对象。 业务对象作为ref参数传递,因为它通过远程处理层。 我需要测试传递给SaveCustomerContact的对象是否按预期设置了所有属性,但由于它在控制器方法中被实例化为new,我似乎无法这样做。 public void AddContact() { var contact = new CustomerContact() { CustomerId = m_model.CustomerId }; contact.Name = m_model.CustomerContactName; contact.PhoneNumber = m_model.PhoneNumber; contact.FaxNumber = m_model.FaxNumber; contact.Email = m_model.Email; contact.ReceiveInvoiceFlag = m_model.ReceiveInvoiceFlag; contact.ReceiveStatementFlag = m_model.ReceiveStatementFlag; contact.ReceiveContractFlag = m_model.ReceiveContractFlag; contact.EmailFlag = m_model.EmailFlag; contact.FaxFlag = m_model.FaxFlag; contact.PostalMailFlag = m_model.PostalMailFlag; contact.CustomerLocationId = m_model.CustomerLocationId; RemotingHandler.SaveCustomerContact( ref contact ); […]

Moq – mock.Raise应该在没有安装程序的情况下在测试单元中引发事件

我有一个演示者类,它附加了注入视图的事件。 现在我想测试演示者对事件的正确反应。 这是视图界面IView: public interface IView { event EventHandler MyEvent; void UpdateView(string test); } 这是实现IView的视图 public partial class MyView : IView { public event EventHandler MyEvent; public MyView() { this.combo.SelectedIndexChanged += this.OnSelectedIndexChanged; } public void UpdateView(string test) { this.textBox.Text = test; } private OnSelectedIndexChanged(Object sender, EventArgs e) { if (this.MyEvent != null) { this.MyEvent(sender, e); […]

如何将新的List {1}放入NUNIT TestCase中?

我有方法: public static int Add(List numbers) { if (numbers == null || numbers.Count == 0) return 0; if (numbers.Count == 1) return numbers[0]; throw new NotImplementedException(); } 这是我对它的测试,但它不喜欢TestCase中的new List {1} : [TestCase(new List{1}, 1)] public void Add_WithOneNumber_ReturnsNumber(List numbers) { var result = CalculatorLibrary.CalculatorFunctions.Add(numbers); Assert.AreEqual(1, result); } 它给了我错误: An attribute argument must be a constant expression, […]

unit testing私有代码

我目前正参与使用C#进行开发 – 这里有一些背景知识:我们使用客户端应用程序实现MVP,并且我们有一个循环规则,该规则指出没有方法应该具有大于5的圈复杂度。这会导致许多小的私有方法这通常是一件事。 我的问题是关于unit testing一个类: 通过公共方法测试私有实现都很好……我没有遇到实现这个问题的问题。 但是……以下情况如何: 示例1.处理异步数据检索请求的结果(回调方法不应仅供公开测试) 示例2.执行操作的事件处理程序(例如更新View标签的文本 – 我知道的愚蠢示例……) 示例3.您正在使用第三方框架,它允许您通过覆盖受保护的虚拟方法进行扩展(从公共方法到这些虚拟方法的路径通常被视为黑盒编程,并且将具有框架提供的各种依赖性你不想知道) 上面的例子在我看来并不是设计不良的结果。 他们似乎也没有成为单独进行单独测试的候选人,因为这样的方法会失去他们的背景。 没有人对此有任何想法吗? 干杯,杰森 编辑:我认为我在原始问题中不够清楚 – 我可以使用访问器测试私有方法,并使用TypeMock模拟调用/方法。 那不是问题。 问题是测试不需要公开或不公开的东西。 我不想为了测试而公开代码,因为它可能会引入安全漏洞(只发布一个接口来隐藏它不是一个选项,因为任何人都可以将对象强制转换回其原始类型并获取访问权限我不希望他们) 被重构到另一个类进行测试的代码很好 – 但可能会失去上下文。 我一直认为让’帮助’类可以包含一堆没有特定上下文的代码是不好的做法 – (在这里思考SRP)。 我真的不认为这适用于事件处理程序。 我很高兴被certificate是错的 – 我只是不确定如何测试这个function! 我一直认为,如果它可以破坏或改变 – 测试它。 干杯,杰森

从数据上下文获取存储过程:Linq到SQl

我在SQL Server中有一个名为ParseXML的存储过程。 我有一个使用LINQ to SQL的存储库模式。 我需要从存储库层中调用存储过程。 与GetTable方法不同,我们没有用于数据上下文的GetStoredProcedure方法。 如何在这种情况下调用存储过程? Dbml代码 [global::System.Data.Linq.Mapping.FunctionAttribute(Name=”dbo.ParseXML”)] public ISingleResult ParseXML([global::System.Data.Linq.Mapping.ParameterAttribute(Name=”InputXML”, DbType=”Xml”)] System.Xml.Linq.XElement inputXML) { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inputXML); return ((ISingleResult)(result.ReturnValue)); } 存储库层 namespace RepositoryLayer { public interface ILijosBankRepository { System.Data.Linq.DataContext Context { get; set; } List GetAllAccountsForUser(int userID); void UpdateBankAccountUsingStoredProcedure(); } public class LijosSimpleBankRepository : ILijosBankRepository { public System.Data.Linq.DataContext Context […]

我可以在Rhino-Mocks 3.6中使用AAA语法测试方法调用顺序吗?

如果Method1在Rhino-mocks 3.6中调用1st,然后调用After后面的Method2,然后使用AAA语法调用Method3,是否可以测试以下示例? // Assert var mock = MockRepository.GenerateMock(); // Act myObject.Service = mock; // How should I change this part to ensure that Rhino Mocks check the call order as well? mock.AssertWasCalled(m=>m.Method1()); mock.AssertWasCalled(m=>m.Method2()); mock.AssertWasCalled(m=>m.Method3());

MSTEST – 异步Testinitialize保证测试失败

只是想知道,如果有人这样想: 这是在TestInitialize中进行异步调用的错误设计,因为TestInitialize必须在任何TestMethod之前发生。 这可能是以任何方式进行异步TestInitialize的正确方法吗? private int val = 0; [TestInitialize] public async Task TestMehod1() { var result = await LongRunningMethod(); val = 10; } [TestMethod] public void TestMehod2() { Assert.AreEqual(10, val); } 任何想法?