在我的例子中,我的集线器位于从项目代码引用的项目中,该项目代码可以自动托管应用程序.
在线connection.Start().Wait();我得到一个例外.以下是该行抛出的异常序列:
引用项目中的消息中心类的签名是public class MessageHub : Hub.
更新:为了测试该理论,我将hub类从引用的项目移动到我的测试项目中并更新了命名空间.有效.所以我认为这里的理论是合理的......默认的集线器解析在参考项目或单独的命名空间中找不到集线器.
如何说服MapHubs在引用的项目中找到测试中心?
此测试是否正确使用AutoFixture和Moq?它是尽可能简明扼要地写的吗?正如预期的那样,测试失败,并在写完正确的实现后通过.
[Fact]
public void CustomerPropertyIsCorrect()
{
var fixture = new AutoMoqFixture();
var expected = fixture.Create<CardHolderCustomer>();
var builderMock = fixture
.Freeze<Mock<ICustomerAdapter>>()
.Setup(x => x.BuildCustomer()).Returns(expected);
var sut = fixture.Create<CardHolderViewModel>();
var actual = sut.Customer;
Assert.Equal(expected, actual);
}
Run Code Online (Sandbox Code Playgroud) 我在测试中有一组工作命令性代码,我试图将其归结为一个基本的测试约定.
我的测试如下所示:
[Theory, BasicConventions]
public void GetVersionOnSiteVersionControllerReturnsASiteVersion(IFixture fixture)
{
fixture.OmitAutoProperties = true;
SiteVersion expected = fixture.Create<SiteVersion>();
SiteVersion actual = null;
var sut = fixture.Create<SiteVersionController>();
var response = sut
.GetSiteVersion()
.ExecuteAsync(new CancellationToken())
.Result
.TryGetContentValue<SiteVersion>(out actual);
actual.AsSource().OfLikeness<SiteVersion>().ShouldEqual(expected);
}
Run Code Online (Sandbox Code Playgroud)
我还有一个允许它工作的自定义,即通过设置HttpConfiguration和HttpRequestMessage默认的非空值.
public class ApiControllerCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
var origin = fixture.OmitAutoProperties;
fixture.OmitAutoProperties = true;
var sut = fixture.Create<SiteVersionController>();
sut.Configuration = fixture.Create<HttpConfiguration>();
sut.Request = fixture.Create<HttpRequestMessage>();
fixture.Inject<SiteVersionController>(sut);
fixture.OmitAutoProperties = origin;
}
}
Run Code Online (Sandbox Code Playgroud)
首先,这看起来很难看,但如果我使用Build <>().omit().with(config).with(request),它会关闭构建这些实例所需的automoq自定义.
其次,这仅适用于SiteVersionController.对于我所有的ApiControllers,我更倾向于概括一下(也许这是一个坏主意,但在我尝试之前我不会知道).
基本上我的约定如下: 对于所有ApiControllers,创建它们没有自动属性但是将http配置和请求消息属性设置为默认的非空值
如何设置确定性测试以验证列表中的项目是否已订购?
首先,我做了以下事情:
public void SyncListContainsSortedItems(
[Frozen] SyncItem[] expected,
SyncItemList sut)
{
Assert.Equal(expected.OrderBy(x => x.Key).First(), sut.First());
}
Run Code Online (Sandbox Code Playgroud)
但是和所有好的测试一样,我在修改代码之前首先查找了一个失败.当然,这成功了,幸运的是,然后失败了.所以我最初的失败不是确定性的.
其次,我做了以下思考,"这肯定会保证失败":
public void SyncListContainsSortedItems(
[Frozen] SyncItem[] seed,
SyncItemList sut)
{
var expected = seed.OrderByDescending(x => x.Key);
Assert.Equal(expected.OrderBy(x => x.Key).First(), sut.First());
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,它也没有提供确定性的失败.我意识到这是因为冷冻的种子可能会自然地以降序开始,所以我真的没有改善这种情况.
现在,我的实现没有命令通过构造函数的项目.如何为我的测试建立稳固的基线?
附加信息同步项目列表代码如下所示.它不是我正在探索的设计:
public class SyncItemList : List<SyncItem>
{
public SyncItemList(SyncItem[] input)
{
foreach (var item in input) { this.Add(item); }
}
}
Run Code Online (Sandbox Code Playgroud)
更新我一直在开发测试.以下工作,但高度冗长.
public void SyncListContainsSortedItems(IFixture fixture, List<SyncItem> seed)
{
var seconditem = seed.OrderBy(x => x.Key).Skip(1).First();
seed.Remove(seconditem); …Run Code Online (Sandbox Code Playgroud) 请注意,我对TDD有些新意,所以我会提出一般性的建议以及具体的答案.
抽象类和接口都不能实例化.显然,Moq可以在第二次测试中给我一个模拟的ADataFeed实例.为什么AutoMoqCustomization适用于接口IDataFeed而不适用于抽象类ADataFeed,而是抛出InvalidOperationException?
其次,AutoFixture方法(或者通常是TDD)可以驱动一个设计,该设计可能需要一个带有构造函数的抽象类来要求并保证某些值,例如在这种情况下的连接字符串?
[Theory, AutoMoqData]
public void AllDataFeedsHaveAConectionString(
IDataFeed sut)
{
var result = sut.GetConnectionString();
Assert.Null(result);
}
[Fact]
public void AllDataFeedsRequireAConnectionString()
{
var expected = Guid.NewGuid().ToString();
var sut = new Mock<ADataFeed>(expected);
var result = sut.Object.GetConnectionString();
Assert.Equal(expected, result);
}
[Theory, AutoMoqData]
public void AllDataFeedsRequireAConnectionString2(
[Frozen] string expected,
ADataFeed sut)
{
var result = sut.GetConnectionString();
Assert.Equal(expected, result);
}
Run Code Online (Sandbox Code Playgroud) 我在我的测试约定中使用AutoMoqCustomization.
请考虑以下代码.在我将一个构造函数添加到其中一个具体类之前,一切都很有效.当我这样做时,我得到"找不到无参数构造函数".我们知道AutoFixture没有构造函数的问题,因为它向我提供了测试对象one,该对象被证明可以从IThings分配......没有失败.所以一定是moq.
这builder有点意义,因为我假设是由moq生成并传递给GetCommands方法.所以我想我可以看到控件已经从AutoFixture传递到moq.
这样可以解决原因,但我该怎么做呢?有没有办法指示moq如何处理ThingOne或有没有办法指示AutoFixture忽略moq for IThingBuilders而是做一些Fixtury?
public class TestClass
{
public interface IThingBuilders
{
T1 Build<T1>() where T1 : IThings;
}
public interface IThings
{
}
public class ThingOne : IThings
{
public ThingOne(string someparam)
{
}
}
public class ThingTwo : IThings
{
}
public class SomeClass
{
public List<IThings> GetCommands(IThingBuilders builder)
{
var newlist = new List<IThings>();
newlist.Add(builder.Build<ThingOne>());
newlist.Add(builder.Build<ThingTwo>());
return newlist;
}
}
[Theory, BasicConventions]
public void WhyCannotInstantiateProxyOfClass(ThingOne one, …Run Code Online (Sandbox Code Playgroud) Customize请解释和之间的功能差异Register,以及何时使用其中之一。下面的示例TestCustomize失败并TestRegister通过。我希望自定义脚本能够正常工作。它的英文读起来是:“生成 时HttpClient,在提供样本之前对其使用后处理 lambda”。
但我得到的是一个带有 GUID 的 HTTP 地址,显然是由 AutoFixture 生成的。
[Fact]
public void TestCustomize()
{
var fixture = new Fixture();
fixture.Customize<HttpClient>(c =>
{
//c.OmitAutoProperties(); makes no difference
c.Do(x => x.BaseAddress = new Uri("http://myval"));
return c;
});
var client = fixture.Create<HttpClient>();
Assert.Equal("http://myval/", client.BaseAddress.ToString());
}
[Fact]
public void TestRegister()
{
var fixture = new Fixture();
fixture.Register(() => new HttpClient
{
BaseAddress = new Uri("http://myval")
});
var client = fixture.Create<HttpClient>();
Assert.Equal("http://myval/", client.BaseAddress.ToString());
}
Run Code Online (Sandbox Code Playgroud) 在很多情况下我都遇到了F#的困难.我相信我没有抓住一些基本概念.我希望有人可以追踪我的推理,并找出我所缺少的(可能很多)事情.
说我正在使用Xunit.我想做的是,提供两个列表,Assert.Equal成对应用方法.例如:
Open Xunit
let test1 = [1;2;3]
let test2 = [1;2;4]
List.map2 Assert.Equal test1 test2
Run Code Online (Sandbox Code Playgroud)
编译器抱怨该函数Equal不带一个参数.据我所知,不map2应该提供2个参数?
作为一个完整性检查,我在f#immediate中使用以下代码:
let doequal = fun x y -> printf "result: %b\n" (x = y)
let test1 = [1;2;3]
let test2 = [1;2;4]
List.map2 doequal test1 test2;;
Run Code Online (Sandbox Code Playgroud)
这似乎完全相同. doequal是一个带有两个通用参数和返回单位的lambda . List.map2将每个参数成对地交给lambda,我得到了我预期的输出:
result: true
result: true
result: false
Run Code Online (Sandbox Code Playgroud)
什么给出了什么?来源节目Xunit.Equal有签名public static void Equal<T>(T expected, T actual).为什么我的参数不会映射到方法签名上?
EDIT ONE 我认为两个变量x和y与一个元组(x,y)可以互换地构造和解构.所以我尝试了两个选项,得到了不同的结果.似乎第二个可能比第一个更进一步.
List.map2 …
在这个测试中,我预计dummyVar是空的.但是,无论我将OmitAutoProperty设置为什么,它都不是.
这是正确的行为吗?为什么?什么是AutoFixture创建空虚拟人集合的方式?
[Fact]
public void ShouldBeEmpty()
{
var fixture = new Fixture();
fixture.Customize(new AutoMoqCustomization());
fixture.OmitAutoProperties = true;
var dummyVar = fixture.Create<IEnumerable<IComparable>>();
Assert.Empty(dummyVar);
}
Run Code Online (Sandbox Code Playgroud) 使用时System.Collections.Concurrent,我应该注意包含的物品?
例如:
ConcurrentDictionary<int,HashSet<string>>vsConcurrentDictionary<int,ConcurrentBag<string>>
由于其行为,散列集可能是可取的......但它不包含在安全的并发集合空间中.那么我是否需要担心多个线程可能会立即写入包含的哈希集...或者这些访问是否会以线程安全的方式在并发字典的上下文中进行管理?MSDN声明HashSet的实例成员不保证是线程安全的.
请解释其含义并提供指导.谢谢.
autofixture ×7
moq ×3
c# ×2
abstract ×1
concurrency ×1
f# ×1
interface ×1
mocking ×1
signalr ×1
xunit.net ×1