C# Лучший способ получить глубину папки для данного пути?

Я думаю, является ли это TDD или нет, не существенная деталь. Я также немного озадачен вашим подходом.

Решение зависит также от вашей среды тестирования. Самым популярным для React является Jest, поэтому я могу найти решение, которое работает с этим довольно хорошо.

Если бы я был на вашем месте, я бы разделил асинхронную функцию на отдельный файл, что облегчает насмешки.

import axios from 'axios';

const getPosts = async () => axios.get('/api/posts/');

export default getPosts;

Предположим, у вас есть компонент PostList в обычной папке src вместе с файлом index.js .

.
├── src
│   ├── index.js
│   ├── PostList
│       ├── __mocks__
│          ├── GetPosts.js
│       ├── PostList.js
│       ├── PostList.test.js
│       ├── GetPosts.js

Папка __ mocks __ распознается Jest и работает должным образом, при условии соблюдения соглашения об именовании файлов:

  • имя файла должно быть такой же, как тот, над которым издеваются.

Также обратите внимание на использование jest.mock('...') в тестовом файле.

Исходя из вашего ложного примера, вы можете определить нечто похожее на это в __ mocks __ / GetPosts.js .

const returnedData = [{
   id: 1,
   title: "Hello",
   description: "World"
}];

const getPosts = jest.fn().mockReturnValueOnce(() => returnedData);

export default getPosts;
// PostList.js 
...
async componentDidMount() {
   const posts = await GetPosts();
   this.setState({
      posts,
   });
}
...

И ваш тестовый файл должен выглядеть примерно так:

import React from 'react';
import { shallow } from 'enzyme';
import PostList from './PostList.js';

jest.mock('./GetPosts.js'); // Here you "tell" to Jest to mock the function.

describe('<PostList />', () => {
   let wrapper;

   beforeAll(async () => {
      wrapper = await shallow(<PostList />);
   });

   describe('componentDidMount', () => {
      it('renders an li tag', () => {
         expect(wrapper.find('li')).toHaveLength(1);
      });
   });
});
11
задан AustinWBryan 9 August 2018 в 17:38
поделиться

4 ответа

Первое, что пришло на ум:

Directory.GetFullPath().Split("\\").Length;
12
ответ дан 3 December 2019 в 03:05
поделиться

Я всегда - поклонник рекурсивные решения. Неэффективный, но забавный!

public static int FolderDepth(string path)
{
    if (string.IsNullOrEmpty(path))
        return 0;
    DirectoryInfo parent = Directory.GetParent(path);
    if (parent == null)
        return 1;
    return FolderDepth(parent.FullName) + 1;
}

Я люблю код Lisp, написанный в C#!

Вот другая рекурсивная версия, которую я люблю еще лучше, и вероятно более эффективно:

public static int FolderDepth(string path)
{
    if (string.IsNullOrEmpty(path))
        return 0;
    return FolderDepth(new DirectoryInfo(path));
}

public static int FolderDepth(DirectoryInfo directory)
{
    if (directory == null)
        return 0;
    return FolderDepth(directory.Parent) + 1;
}

Хорошие времена, хорошие времена...

4
ответ дан 3 December 2019 в 03:05
поделиться

Принятие Вашего пути уже исследовалось для того, чтобы быть допустимым, в.NET 3.5 Вы могли также использовать LINQ, чтобы сделать это в 1 строке кода...

Консоль. WriteLine ("C:\Folder1\Folder2\Folder3\Folder4\MyFile.txt".Where (c => c = "\").Count);

3
ответ дан 3 December 2019 в 03:05
поделиться

Если Вы используете членов Path класс, можно справиться с локализациями разделительного символа пути и других связанных с путем протестов. Следующий код обеспечивает глубину (включая корень). Это не устойчиво к плохим строкам и такому, но это - запуск для Вас.

int depth = 0;
do
{
    path = Path.GetDirectoryName(path);
    Console.WriteLine(path);
    ++depth;
} while (!string.IsNullOrEmpty(path));

Console.WriteLine("Depth = " + depth.ToString());
1
ответ дан 3 December 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: