我试图验证使用正确的参数调用异步方法.但是,我得到警告:
"因为没有等待这个调用,所以当前方法的执行在调用完成之前继续.考虑将'await'运算符应用于调用的结果".此警告显示在//Assert注释下方的代码行上(下方).
我使用NSubstitute的测试如下:
[Test]
public async Task SimpleTests()
{
//Arrange
var request = CreateUpdateItemRequest();
databaseHelperSub.ExecuteProcAsync(Arg.Any<DatabaseParams>()).Returns(Task.FromResult((object)null));
//Act
await underTest.ExecuteAsync(request);
//Assert
databaseHelperSub.Received().ExecuteProcAsync(Arg.Is<DatabaseParams>(
p => p.StoredProcName == StoredProcedureName
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Value1"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Value2"));
}
Run Code Online (Sandbox Code Playgroud)
被测单元方法underTest.ExecuteAsync(request)调用ExecuteProcedureAsync并执行await:
var ds = await DatabaseHelper.ExecuteProcAsync(dbParams);
Run Code Online (Sandbox Code Playgroud)
由于使用NSubstitute,在执行被测单元后需要Received().而在RhinoMocks中,您可以预期在执行测试单元之前进行调用.RhinoMocks可以返回Task.FromResult()而NSubstitute不能.
RhinoMocks等效的工作原理如下:
[Test]
public async Task SimpleTest()
{
// Arrange
var request = new UpdateItemRequest();
databaseHelperMock.Expect(m => m.ExecuteProcAsync(Arg<DatabaseParams>.Matches(
p => p.StoredProcName == …Run Code Online (Sandbox Code Playgroud) 下面是我正在使用的表结构和数据类型的子集.
CREATE TABLE #Test
(
Val varchar(5)
,Type varchar(5)
)
INSERT #Test VALUES ('Yes','Text')
INSERT #Test VALUES ('10','Int')
INSERT #Test VALUES ('10.00','Float')
INSERT #Test VALUES ('9.00','Float')
INSERT #Test VALUES ('9','Int')
Run Code Online (Sandbox Code Playgroud)
我想写一个查询,让我知道列'Val'是否<= 9.00(必须是数字数据类型).我通过执行以下操作来完成此操作:
SELECT *
FROM
(
SELECT Val
FROM #Test
WHERE Type = 'Int'
) IntsOnly
WHERE IntsOnly.Val <= 9.00
Run Code Online (Sandbox Code Playgroud)
这给了我一个算术溢出错误.但是,如果我使用值"10"排除数据行:
SELECT *
FROM
(
SELECT Val
FROM #Test
WHERE Type = 'Int'
AND Val <> '10'
) IntsOnly
WHERE IntsOnly.Val <= 9.00
Run Code Online (Sandbox Code Playgroud)
它没有任何问题.我的问题不是如何解决这个问题,因为我知道我可以简单地将数据转换为我需要的格式.
我的问题是为什么'Val'列中'10'的值返回错误.当然逻辑应该只返回'False'并简单地排除行,因为'10'(我假设是隐式转换的)大于9.00.
谢谢.
我们目前正在从RhinoMocks迁移到NSubstitute.
我有一个采用类型对象的方法DatabaseParams.该类具有以下结构(简化):
public class DatabaseParams
{
public string StoredProcName { get; private set; }
public SqlParameter[] Parameters { get; private set; }
public DatabaseParams(string storeProcName, SqlParameter[] spParams)
{
StoredProcName = storeProcName;
Parameters = spParams;
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下方法我想检查传递给它的参数是否正确:
public interface IHelper
{
Task<object> ExecuteScalarProcedureAsync(DatabaseParams data);
}
Run Code Online (Sandbox Code Playgroud)
如何DatabaseParams使用正确的值测试传递给该方法的实例?
我可以在RhinoMocks中用这样的方法做到这一点:
helperMock.Expect(m => m.ExecuteScalarProcedureAsync(Arg<DatabaseHelperParameters>.Matches(
p => p.StoredProcName == "up_Do_Something"
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Param1Value"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Param2Value"
))).Return(Task.FromResult<DataSet>(null));
Run Code Online (Sandbox Code Playgroud)
正在模拟包含该方法helperMock …
事先道歉,因为我知道这个问题多次出现过.但是,我正在努力找出我自己的代码出错的地方.只需查找旁边的复选框和名称列表.目前它编译好,但ListBox为空.
所有代码都在一个名为ucDatabases的控件中.
XAML:
<ListBox Grid.Row="4" ItemsSource="{Binding Databases}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}" Margin="5 5 0 0"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
C#代码:
public ObservableCollection<CheckBoxDatabase> Databases;
public class CheckBoxDatabase : INotifyPropertyChanged
{
private string name;
private bool isChecked;
public Database Database;
public bool IsChecked
{
get { return isChecked; }
set
{
isChecked = value;
NotifyPropertyChanged("IsChecked");
}
}
public string Name
{
get { return name; }
set
{
name = value;
NotifyPropertyChanged("Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void …Run Code Online (Sandbox Code Playgroud) 我有一些我想要序列化为JSON的对象.但是,某些对象具有通过属性被视为"SensitiveData"的属性.
[SensitiveDataAttribute]
public string SomeSensitiveProperty {get; set;}
Run Code Online (Sandbox Code Playgroud)
目前,我正在覆盖序列化程序上的'CreateProperty'方法,以便我可以根据是否具有此'SensitiveData'属性来更改是否应该序列化属性:
public class SensitiveDataResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance =>
{
if (member is PropertyInfo)
{
var prop = (PropertyInfo) member;
var isSensitiveData = Attribute.IsDefined(prop, typeof (SensitiveDataAttribute));
return !isSensitiveData;
}
return false;
};
return property;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我序列化时,我然后使用该解析器作为序列化器的设置:
var settings = new JsonSerializerSettings() { ContractResolver = new SensitiveDataResolver() };
var requestString = JsonConvert.SerializeObject(someObject, settings);
Run Code Online (Sandbox Code Playgroud)
我的问题是,我不希望从序列化中排除属性.我希望它们被序列化,但默认值为'SensitiveData'.
有没有办法使用Attributes实现这一目标?
我有一个名为ClientUrls具有以下结构的表:
+------------+----------------+----------+
| ColumnName | DataType | Nullable |
+------------+----------------+----------+
| ClientId | INT | No |
| CountryId | INT | Yes |
| RegionId | INT | Yes |
| LanguageId | INT | Yes |
| URL | NVARCHAR(2048) | NO |
+------------+----------------+----------+
Run Code Online (Sandbox Code Playgroud)
我有一个存储过程up_GetClientUrls,它采用以下参数:
@ClientId INT
@CountryId INT
@RegionId INT
@LanguageId INT
Run Code Online (Sandbox Code Playgroud)
关于过程的信息
优先级矩阵(1为第一)
+---------+----------+-----------+----------+------------+
| Ranking | ClientId | CountryId | RegionId | LanguageId |
+---------+----------+-----------+----------+------------+
| 1 | …Run Code Online (Sandbox Code Playgroud) c# ×4
nsubstitute ×2
sql ×2
t-sql ×2
async-await ×1
asynchronous ×1
json ×1
json.net ×1
listbox ×1
mocking ×1
sql-server ×1
unit-testing ×1
wpf ×1