小编JBo*_*ond的帖子

NSubstitute - 收到异步 - "等待呼叫"警告

我试图验证使用正确的参数调用异步方法.但是,我得到警告:

"因为没有等待这个调用,所以当前方法的执行在调用完成之前继续.考虑将'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)

c# unit-testing asynchronous nsubstitute async-await

23
推荐指数
2
解决办法
1万
查看次数

将varchar转换为数据类型numeric的算术溢出错误.'10'<= 9.00

下面是我正在使用的表结构和数据类型的子集.

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.

谢谢.

sql t-sql sql-server-2008

9
推荐指数
1
解决办法
8万
查看次数

NSubstitute - 检查传递给方法的参数

我们目前正在从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 …

c# mocking nsubstitute

9
推荐指数
2
解决办法
4770
查看次数

在WPF中实现CheckBoxes的ListBox

事先道歉,因为我知道这个问题多次出现过.但是,我正在努力找出我自己的代码出错的地方.只需查找旁边的复选框和名称列表.目前它编译好,但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)

c# wpf listbox

8
推荐指数
1
解决办法
2万
查看次数

替换JSON序列化上的敏感数据值

我有一些我想要序列化为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实现这一目标?

c# serialization json json.net

6
推荐指数
1
解决办法
1904
查看次数

存储过程以优先级基于可空列返回数据

我有一个名为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. proc需要所有参数,它们都不是NULL
  2. proc的目的是根据预定义的优先级返回表中的单个匹配行.优先级为ClientId>国家>地区>语言
  3. ClientUrls表中的三个列可以为空.如果一列包含NULL,则表示"全部".例如,如果LanguageId为NULL,则它引用"AllLanguages".因此,如果我们将一个5的LanguageId发送到proc,我们先查找它,否则我们会尝试找到一个NULL.

优先级矩阵(1为第一)

+---------+----------+-----------+----------+------------+
| Ranking | ClientId | CountryId | RegionId | LanguageId |
+---------+----------+-----------+----------+------------+
|       1 | …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server stored-procedures

5
推荐指数
1
解决办法
89
查看次数