Tag: unit testing

具有匿名对象的Arg .Is.Equal

在我的MVC3项目中,我使用IUrlProvider接口来包装UrlHelper类。 在我的一个控制器操作中,我有这样的调用: string url = _urlProvider.Action(“ValidateCode”, new { code = “spam-and-eggs” }); 我想在我的unit testing中存根这个方法调用,这是在一个单独的项目中。 测试设置看起来像这样: IUrlProvider urlProvider = MockRepository.GenerateStub(); urlProvider.Stub(u => u.Action( Arg.Is.Equal(“ValidateCode”), Arg.Is.Equal(new { code = “spam-and-eggs” }) )) .Return(“http://www.mysite.com/validate/spam-and-eggs”); 不幸的是, Arg.Is.Equal(new { code = “spam-and-eggs” })不起作用,因为new { code = “spam-and-eggs” } != new { code = “spam-and-eggs” }在不同的程序集中声明匿名类型时。 那么,是否有一种替代语法可以与Rhino Mocks一起使用来检查跨程序集的匿名对象之间的匹配字段值? 或者我应该用类替换匿名对象声明,像这样? public class […]

System.BadImageFormatException:无法加载文件或程序集’x_Accessor,…’此程序集由运行时更新程序构建

System.BadImageFormatException: Could not load file or assembly ‘x_Accessor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded. 我很难找到治愈这种疾病的方法…… 我已经为点网测试项目创建了unit testing。 使用默认的unit testing框架。 自动化工具创建了一个访问器 – 用于测试私有方法 。 [我知道理论,私人方法应该通过他们的来电者进行测试 – 但是,这取决于他们的目的,内容,背景等……所以,如果可以的话,我会测试它们。 我过去在几个项目中做过这个,它运行良好。 但是在我试图测试的这两个项目中,我遇到了这个问题…… 注意:我使用的是Framework 3.5 – 这可能是个问题? – 但访问者应该知道! 我完全看不到在哪里可以修改程序集的运行时…我想这是访问器。 是的,我做了清理和重建,我完全删除了输出文件夹并重建,我确实删除了访问者和私有方法并重新创建它。 […]

如何unit testingHttpContext.SignInAsync()?

SignInAsync()源代码 我遇到了unit testing的一些问题。 DefaultHttpContext.RequestServices为null 我试图创建AuthenticationService对象,但我不知道要传递什么参数 我该怎么办? 如何unit testingHttpContext.SignInAsync() ? 测试方法 public async Task Login(LoginViewModel vm, [FromQuery]string returnUrl) { if (ModelState.IsValid) { var user = await context.Users.FirstOrDefaultAsync(u => u.UserName == vm.UserName && u.Password == vm.Password); if (user != null) { var claims = new List { new Claim(ClaimTypes.Name, user.UserName) }; var identity = new ClaimsIdentity(claims, “HappyDog”); […]

跨程序集和命名空间的dependency injection

我正在研究DI问题,我认为我理解其原因,但我需要一些建议来解决。 我已经构建了一个独立的程序集,它与Sql(称为程序集a)和另一个包含业务逻辑的程序集(称为程序集b)进行对话。 我在b程序集中为db类创建了一个接口。 由于接口不是db程序集的一部分,因此我不需要对db项目的任何引用,如果我想在运行时运行unit testing而不是程序集,我可以加载对db程序集或存根的引用需要知道另一个。 我可以在编译看起来像这样的业务逻辑库中编写代码:(假装a和b是各自程序集中的名称空间) a.IDatabaseClass db_class = (a.IDatabase)new b.Database(); 但是当我尝试运行它时,我得到一个无效的强制转换exception。 我认为它编译是因为接口完美匹配类,但在运行时失败,因为对象签名在Database类的inheritance链中没有看到IDatabase。 在c ++中,你可以随心所欲地抛出任何东西,但是c#对于构建对象指针有点严格。 即使该类具有所有正确的函数签名,它也会因为对象不匹配而爆炸。 现在我可以将db对象接口放在具有db对象的程序集中,但是业务逻辑需要对db程序集的引用。 此外,这只会产生复杂性,因为如果我在unit testing中编写存根db对象,我需要对我将在测试存根对象中使用的接口的db程序集的引用。 通过这样做,这似乎并没有解开耦合…… 我可以将所有接口放在第三个程序集中,该程序集是db程序集,业务逻辑和unit testing的父级。 这就是解决循环依赖问题的方法。 但是,这会将db程序集绑定到父程序集,并使其与其他项目一起使用的模块化程度要低得多。 我愿意接受有关如何设置每个组件以便它们独立运行并可用于DI的建议。 我想我可以将测试存根对象保存在与真实代码相同的程序集中,但这看起来很奇怪。 解决方案:以下回复中的一个回复说明我拍摄的内容基本上是接口的鸭子类型。 C#当前不支持duck typing,但我认为它可能是可能的,因为接口实现的行为方式类似于你可能称之为部分类指针的方式(或者更准确地说,是函数指针的集合)。 我的实验向我展示了其他情况,这就是原因。 因此,在Redmond将“更多野鸭”放入c#之前,看起来我们无法完全达到最终优雅的解耦组件。

如何测试通过公共方法修改的私有字段

任何人都可以用一种建议的方法来指导我测试通过公共方法修改的类中的私有字段。 我已经阅读了很多人的意见,建议不建议测试私有成员,因为它们是实现的内部,但是这种情况似乎与大多数其他答案不同。 我正在考虑使私有字段受到保护并创建一个公开该字段的测试子类,但如果我无法修改该类的内部,该怎么办? 在下面的示例代码中,要测试的私有成员将是_values,它是一个只写集合,通过AddValue()接收新值。 public class Sample { private Dictionary _values; private DateTime _created; public Sample() { _values = new Dictionary(); _created = DateTime.Now; } public void AddValue(string key, string value) { _values.Add(key, value); } }

Moq框架Func

我是Moq和TDD的新手,我想要做的是在存储库接口上设置方法。 这是全文。 我有一个名为Tenant的域实体类,其属性为BusinessIdentificationNumber public class Tenant:EntityBase,IAggregateRoot { … public string BusinessIdentificationNumber {get;set;} … } 接下来我有这个实体的存储库,接口就像 public interface IRepository { … T FindBy(Func func); … } 问题出在哪里,我使用域名服务,其中包含创建租户的规则,就像 public class TenantCreationService:ITenantCreationService { public TenantCreationService(IRepository tenantRepository){…} public void CreateTenant(Tenant tenant) { //from here there is call to IRepository.FindBy(funcMethod); } } 在我正在测试TenantCreationService的unit testing中,我模拟了传递给构造函数的存储库,但我想测试该function: 当具有BusinessIdentificationNumber的租户已经存在于存储或会话中时,应该返回它。 所以我试着这样做 repositoryMock.Setup(x=>x.FindBy(It.Is(t=>t.BusinessIdentificationNumber == _tenantInTest.BusinessIdentificationNumber))).Returns(_tenantInTest) 但它没有编译。 […]

使用Visual Studiounit testingC#的命令行参数

我应该使用VSunit testing框架来确保所有代码都正常工作。 但是,我很难获得需要命令行参数的测试(因为命令行输入必须在运行时给出……并且unit testing没有真正的“运行时”)。 有没有办法用命令行参数输入运行我的unit testing? 我意识到这不是构建程序的理想方式,但遗憾的是我没有决定测试过程的工作原理。 我已经读过,我可以写一个批处理文件并将其包含在MStest / testcontainer文件夹中。 尽管如此,我必须清除一些冲击,以便这样做。 这些冲击包括: 1)我对批处理文件一无所知 2)我不知道MStest / testcontainer文件夹在哪里,如何访问它,它是如何工作的,甚至不知道如何向它添加文件(因为它似乎是隐藏的或不容易访问)。 3)我不知道我对批处理文件做了什么,即使它是在MStest / testcontainer文件夹中正确写入的。 我的测试甚至应该知道它在哪里,更不用说从中获取输入了? 总结一下:如何让VSunit testing接受命令行参数? 如果我必须使用批处理文件方法,我将非常感谢它向我解释,就像我是5.我道歉,如果我在这个主题上显得有些无助,但我找不到任何明确或有用的解释在这个特定的背景下,这些东西是如何运作的。 万分感谢。

如何仅在列表中的项目的子范围上分配属性?

我想使用AutoFixture创建自定义对象列表。 我希望前N对象的属性设置为一个值,剩余部分将其设置为另一个值(或者简单地由Fixture的默认策略设置)。 我知道我可以使用Fixture.CreateMany.With ,但这Fixture.CreateMany.With一个函数应用于列表的所有成员。 在NBuilder有一些名为TheNext和TheNext (以及其他)的方法可以提供此function。 他们使用的一个例子: 鉴于Foo类: class Foo { public string Bar {get; set;} public int Blub {get; set;} } 可以像这样实例化一堆Foo : class TestSomethingUsingFoo { /// … set up etc. [Test] public static void TestTheFooUser() { var foosToSupplyToTheSUT = Builder.CreateListOfSize(10) .TheFirst(5) .With(foo => foo.Bar = “Baz”) .TheNext(3) .With(foo => foo.Bar = “Qux”) .All() […]

测试自定义AuthorizationAttribute时抛出NullReferenceException

我看了看: 如何进行unit testing以测试检查请求标头的方法? 如何使用moq模拟Controller.User 如何对应用了[Authorize]属性的控制器方法进行unit testing? 我正在尝试测试我编写的自定义AuthorizeAttribute。 我尝试了很多不同的东西来让它发挥作用。 这是我目前的尝试。 [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)] public class ConfigurableAuthorizeAttribute : AuthorizeAttribute { private Logger log = new Logger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private IRoleHelper roleHelper; public ConfigurableAuthorizeAttribute() { roleHelper = new ADRoleHelper(); } public ConfigurableAuthorizeAttribute(IRoleHelper roleHelper) { this.roleHelper = roleHelper; } protected override bool AuthorizeCore(HttpContextBase httpContext) { if (!httpContext.User.Identity.IsAuthenticated) […]

在什么情况下和不运行

我有一组MSTest测试用例,它们使用带有这些属性的方法从测试开始后创建的测试数据库中的表中删除所有行; 我偶尔会在数据库中的一个unit testing中得到一行。 由于我正在保存测试开始时间并删除时间戳比它更新的所有记录,因此我可以看到记录幸存的唯一方法是未调用清理代码。